【问题标题】:Access to URL general URL paramter instead of :id访问 URL 通用 URL 参数而不是 :id
【发布时间】:2020-08-17 13:33:11
【问题描述】:

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

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

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

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

使 id 在比萨饼控制器的 show 动作中作为 params[:id] 可用。例如,如果有人访问 /pizzas/3,params[:id] 将产生 3。

是否可以使用类似的东西

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

要在比萨饼控制器的 show 动作中访问 :pizzaname,即作为 params[:pizzaname]?

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

【问题讨论】:

标签: ruby-on-rails routes ruby-on-rails-5


【解决方案1】:

使用字符串时,您实际上只是创建了一个模式,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"
}

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

resources :pizzas, param: :pizza_name

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2020-02-28
    • 2013-08-12
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多