我有一个Contact
模型我想通过网址中的一个slug访问,所以我像这样覆盖to_param
:
def to_param
"#{self.id}-#{full_name.parameterize}"
end
我正在使用标准的,宁静的资源:
resources :contact
这可以按预期工作。路径助手返回细化的URL。并且URL正确路由到控制器。到目前为止,非常好。
问题在于尽管slug正确路由,但更新路由规范以反映更改会导致规范失败。
E.g。这个规范失败了:
get("/contacts/1-john-smith").should route_to("contacts#show", :id => "1")
原始版本通过:
get("/contacts/1").should route_to("contacts#show", :id => "1")
这里的东西并不完全相加。当URL在浏览器中正确解析时,规范如何失败?如何更改to_param
不会破坏原始网址?
更重要的是,如何更改路由声明以使规范通过?我可以使用resources
声明执行此操作吗?或者我必须手动定义这些路线?
答案 0 :(得分:1)
在get
中,您传递id
"1-john-smith"
,这就是您的控制器将收到的内容。将您的规格更改为:
get("/contacts/1-john-smith").should route_to("contacts#show",
:id => "1-john-smith")
路由代码与您添加的slug功能无关,并且它不会知道剥离id
参数的某些部分。神奇主要在ActiveRecord::Base#find
,因为:
Contacts.find "1-john-smith"
的工作方式与此相同:
Contacts.find "1"