Rails 3 - 自定义资源丰富的路线
Posted
技术标签:
【中文标题】Rails 3 - 自定义资源丰富的路线【英文标题】:Rails 3 - Customizing resourceful routes 【发布时间】:2011-07-10 12:39:20 【问题描述】:我为博客设置了资源丰富的路由(模型名称:文章)。
我想自定义我的资源路由来指向
articles/show/title-of-my-article
现在我通读了:
http://edgeguides.rubyonrails.org/routing.html#customizing-resourceful-routes
但它似乎并没有解释如何覆盖参数,而不仅仅是 :controller 或 :action。问题是我可以做一个单一的资源或匹配一个 GET 请求,但我想覆盖我的资源丰富的路线,所以我仍然可以使用所有资源助手(即 article_path(@article.title) )等。
任何人都可以在这里帮助我,非常感谢任何和所有的帮助!
【问题讨论】:
【参考方案1】:您应该覆盖模型上的 to_param 方法:
class Article
def to_param
self.title
end
end
如果你想变得更棘手,你应该阅读generating custom slugs。
【讨论】:
【参考方案2】:除了乔尼的回答。
当你调用像article_path(@article)
这样的资源助手时,覆盖to_param
方法会产生标题,它会作为params[:id]
传递给控制器。
此后,您将需要或多或少手动查找文章,即,而不是这样做
Article.find(params[:id])
你需要这样做
Article.find_by_title(params[:id])
如果没有找到记录,我不记得是否会创建 NotFound
异常,因为 find
方法会这样做,在这种情况下,您必须手动检查是否找到记录并自己引发异常如果不是为了触发404页面。
这样做的一个问题是标题可能包含 URL 中不允许或不推荐的字符,因此更好的方法是根据标题在数据库中存储一个 slug 并通过它找到它。
(您可以通过在模型中使用过滤器自动创建 slug,并通过title.parameterize
创建它)
最简单的方法当然是使用已经处理这些事情的众多 gem 和插件之一。
【讨论】:
是的,我知道我必须去掉标题中所有不好的部分以使其对 URL 友好。我将自己编写或使用 gem 来操作 before_save 过滤器中的标题,并将操作后的字符串保存在数据库中的 URL 字段中。然后覆盖 jonnii 提供的 to_param 方法。非常感谢你们!以上是关于Rails 3 - 自定义资源丰富的路线的主要内容,如果未能解决你的问题,请参考以下文章