Rails 4自定义命名路由不调用模型的正确属性

时间:2015-05-25 15:18:16

标签: ruby-on-rails rails-routing

根据http://edgeguides.rubyonrails.org/routing.html#overriding-named-route-parameters我定义了一个带有自定义命名路由参数的路由,而不是:id来创建友好的URL。 routes.rb看起来像:

resources :spaces, param: :name

运行rake routes确实为动态细分提供了正确的路径:

space GET    /spaces/:name(.:format)                spaces#show

但是使用space_path仍尝试检索ID:

irb(main):009:0> app.space_path space
=> "/spaces/1"

它应该给“/ spaces / foo”(假设id=1的空格有name=foo

我可以明确地做:

irb(main):009:0> app.space_path space.name
=> "/spaces/foo"

但后来我失去了动态路径的全部观点,我的所有观点都变得更加脆弱。动态路径是否应该识别要检索的属性?

我知道我可以覆盖模型中的to_params,但同样,这不是让模型变脆吗?动态路径不应该识别动态段的名称并从模型中检索正确的属性吗?

1 个答案:

答案 0 :(得分:2)

app.space_path将采用您提供的第一个参数并将其替换为:name。如果参数是ActiveModel实例,它将在其上调用to_param,除非您覆盖它,否则将返回id属性的值 - 在本例中为1,而不是{ {1}}。

如果您希望foo返回app.space_path(space),则需要覆盖/spaces/foo

Space#to_param

您的路线中唯一class Space < ActiveRecord::Base # ... def to_param name end end 确定的是:name中该值的关键字在您的控制器中,即如果请求params/spaces/foo将是params[:name]