我为博客设置了资源丰富的路线(型号名称:文章)。
我想自定义我的资源路线指向
articles/show/title-of-my-article
现在我读完了这个:
http://edgeguides.rubyonrails.org/routing.html#customizing-resourceful-routes
但它似乎没有解释如何覆盖params而不仅仅是:controller或:action。问题是我可以做一个单一的资源或匹配一个GET请求,但我想覆盖我的资源丰富的路由,所以我仍然可以使用所有的资源助手(即article_path(@ article.title))等。
任何人都可以帮助我,非常感谢任何帮助!
答案 0 :(得分:1)
您应该覆盖模型上的to_param方法:
class Article
def to_param
self.title
end
end
如果你想变得有点棘手,你应该阅读generating custom slugs。
答案 1 :(得分:0)
除了乔尼的回答。
当您调用to_param
等资源助手时,覆盖article_path(@article)
方法将生成标题,并将其作为params[:id]
传递给控制器。
此后,您需要手动或多或少地查找文章,即不要执行
Article.find(params[:id])
你需要做
Article.find_by_title(params[:id])
我不记得是否因为NotFound
方法找不到记录而导致该find
异常,在这种情况下,如果找到记录,则必须手动检查如果不是为了触发404页面,请自己提出异常。
这样做的一个问题是标题可能包含URL中不允许或推荐的字符,因此更好的方法是根据数据库中的标题存储一个slug并按此找到它。 / p>
(您可以通过在模型中使用过滤器并通过title.parameterize
创建过滤器来自动创建slug)
最简单的当然是使用已经处理好这些事情的众多宝石和插件之一。