根据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
,但同样,这不是让模型变脆吗?动态路径不应该识别动态段的名称并从模型中检索正确的属性吗?
答案 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]
。