假设我在routes.rb中有这段代码
get "/items/(:brand)", to: "items#index", as: :items
我无法改变这条路线,因为有时候我需要带路径品牌的网址(不在查询中)。 我可以创建这样的路径:
/items?brand=TestBrand
但不是这样:
/items/TestBrand
通过路线助手?
items_path(brand: "TestBrand")
提供2&#39变种。
答案 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
你必须得到这个