Rails查询参数与可选路径参数同名

时间:2018-04-16 12:25:57

标签: ruby-on-rails rails-routing

假设我在routes.rb中有这段代码

get "/items/(:brand)", to: "items#index", as: :items

我无法改变这条路线,因为有时候我需要带路径品牌的网址(不在查询中)。 我可以创建这样的路径:

/items?brand=TestBrand

但不是这样:

/items/TestBrand

通过路线助手?

items_path(brand: "TestBrand")提供2&#39变种。

3 个答案:

答案 0 :(得分:3)

这不是一个非常好的解决方案,因为它违反了RESTful惯例。

在Rails风格中,REST GET /resource_name/:id映射到show route。在get "/items/(:brand)", to: "items#index", as: :items的情况下,当路由器匹配请求并且第一个声明的路由将赢得这是不可取的时,这会产生歧义(是一个项目ID或品牌?)。

更好的解决方案是将其声明为嵌套资源:

resources :brands, only: [] do
  resources :items, only: [:index], module: :brands
end
    Prefix Verb URI Pattern                       Controller#Action
brand_items GET  /brands/:brand_id/items(.:format) brands/items#index
# app/controllers/brands/items_controller.rb
module Brands
  class ItemsController < ::ApplicationController
    before_action :set_brand

    # GET /brands/:brand_id/items
    def index
      @items = @brand.items
    end

    def set_brand
      @brand = Brand.find(params[:brand_id])
    end
  end
end

答案 1 :(得分:0)

默认情况下支持“get”中的其他参数,因此您可以使用

get "/items", to: "items#index", as: :items

resources :items, only: [:index]

并使用您提供的路径助手:

items_path(brand: "TestBrand")

答案 2 :(得分:0)

回答你的问题 - 是的,你可以

get "/items", to: "items#index", as: :items

以及以下路线助手将创建

items_path(brand: "TestBrand")
#=> items?brand=TestBrand

注意:

如果您正在使用:

recourses :items

你必须得到这个