访问 URL 一般 URL 参数而不是 :id

Access to URL general URL paramter instead of :id

要处理对 /pizzas/marinara 的请求,我可以使用

get '/pizzas/marinara', to: 'pizzas#marinara'

但是,如果有很多不同种类的比萨饼,则引入相应的变量是有意义的。我知道

get '/pizzas/:id', to: 'pizzas#show'

使 id 在 pizzas 控制器的显示操作中作为参数 [:id] 可用。例如,如果有人访问 /pizzas/3,params[:id] 将产生 3.

是否可以使用类似

的东西
get '/pizzas/:pizzaname', to: 'pizzas#show'

在 pizzas 控制器的 show 操作中访问 :pizzaname,即作为参数[:pizzaname]?

(我发现了几个相关的问题,但它们似乎都与资源有关,而我正试图以更明确的方式解决这个问题。)

使用字符串时,您实际上只是在创建一个模式,rails 会将传入的 URL 匹配到该模式。 :id 只是该模式中的一个 dynamic segment,因此无论您为段使用什么名称都将映射到参数散列:

get '/pizzas/:foo(/:bar)(/:baz)', to: 'pizzas#show'

在这条路线中,我们添加了两个额外的可选动态段,因此 /pizzas/exotic/hawaii/with_extra_pineapple 您将为您提供以下参数哈希:

{
  "controller"=>"pizzas", 
  "action"=>"show", 
  "foo"=>"exotic", 
  "bar"=>"hawaii", 
  "baz"=>"with_extra_pineapple"
}

您还可以通过传递 param 选项在使用 resources 宏时自定义 id 参数的名称:

resources :pizzas, param: :pizza_name

然而,一如既往,当你打破常规时,你真的需要问问自己,你是否只是在做一个怪人,它是否真的有任何真正的目的。我的猜测是答案是否定的,因为您可以在不更改参数名称的情况下添加“友好的 url”。