【问题标题】:Routes and routing specs for restful resources with custom slugs带有自定义 slug 的 restful 资源的路由和路由规范
【发布时间】:2011-10-09 11:12:43
【问题描述】:

我有一个 Contact 模型,我想通过 URL 中的 slug 访问它,所以我像这样覆盖了 to_param

def to_param
   "#{self.id}-#{full_name.parameterize}"
end

我正在使用标准、宁静的资源:

resources :contact

这按预期工作。路径助手返回 slugified URL。并且 URL 已正确路由到控制器。到目前为止,一切顺利。

问题在于,虽然 slug 路由正确,但更新路由规范以反映更改会导致规范失败。

例如此规范失败:

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 不会破坏原始 URL?

更重要的是,如何更改路由声明以使规范通过?我可以使用resources 声明来做到这一点吗?还是我必须手动定义这些路线?

【问题讨论】:

    标签: ruby-on-rails routing rspec slug


    【解决方案1】:

    在您的get 中,您传递了"1-john-smith"id,这就是您的控制器将收到的内容。将您的规格更改为:

    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"
    

    【讨论】:

    • 完全正确~谢谢!我一直在寻找一种方法来定义路由,以便在将数字 ID 传递给控制器​​之前从 slug 中解析出来,但由于 #find 使它们无论如何都等价,因此在这种情况下并不重要。跨度>
    • 我打赌#find 只是使用String#to_i,所以如果你出于某种原因需要数字部分,你可以使用它。 "1-john-smith".to_i => 1
    • 确实如此。尽管最初的问题不是如何实际解析出整数,而是将逻辑挂钩到路由机制的位置。看起来您只能将整个段作为参数传递给控制器​​。例如,我没有看到任何从正则表达式中解析变量的机制。
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2014-08-22
    • 2015-06-09
    • 2011-07-05
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多