问题描述
要处理对/ pizzas / marinara的请求,我可以使用
get '/pizzas/marinara',to: 'pizzas#marinara'
但是,如果有很多不同种类的披萨,则引入相应的变量是有意义的。我知道
get '/pizzas/:id',to: 'pizzas#show'
使ID在paramss控制器的show动作中可作为params [:id]使用。例如,如果有人访问/ pizzas / 3,则params [:id]将产生3。
是否可以使用类似的东西
get '/pizzas/:pizzaname',to: 'pizzas#show'
要在Pizzas控制器的show操作中访问:pizzaname,即作为params [:pizzaname]吗?
(我发现了几个相关的问题,但是它们似乎都与资源有关,而我正试图以更明确的术语来解决这个问题)。
解决方法
使用字符串时,您实际上实际上是在创建一个轨将与传入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"
}
在使用resources宏时,还可以通过传递param
选项来自定义id参数的名称:
resources :pizzas,param: :pizza_name
但是,与常规打破常规时,您确实需要问自己是否只是一个骗子,它是否真正有任何实际目的。我的猜测是,答案是否定的,因为您可以在不更改参数名称的情况下添加“友好的url”。