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 - 自定义资源丰富的路线的主要内容,如果未能解决你的问题,请参考以下文章

要映射到 rails 4 中的自定义路径的资源路由

Rails:路由到自定义控制器操作

加载资源失败:404(未找到)- Rails 自定义字体

Rails表单标签不会自定义删除路由,而是转到标准删除路由

rails 3 的验证自定义消息

Rails 中的自定义字段作为未来条目的模板