使用自定义slug的restful资源的路由和路由规范

时间:2011-07-20 14:34:41

标签: ruby-on-rails routing rspec slug

我有一个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声明执行此操作吗?或者我必须手动定义这些路线?

1 个答案:

答案 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"