【发布时间】:2011-01-05 19:54:31
【问题描述】:
我目前正在使用 Ruby on Rails 开发博客系统,并希望用户为静态页面或博客文章定义他的“永久链接”,意思是:
用户应该能够设置页面名称,例如。 “test-article”(应该可以通过 /posts/test-article 获得) - 我如何在 rails 应用程序和路由文件中实现这一点?
【问题讨论】:
标签: ruby-on-rails routing routes
我目前正在使用 Ruby on Rails 开发博客系统,并希望用户为静态页面或博客文章定义他的“永久链接”,意思是:
用户应该能够设置页面名称,例如。 “test-article”(应该可以通过 /posts/test-article 获得) - 我如何在 rails 应用程序和路由文件中实现这一点?
【问题讨论】:
标签: ruby-on-rails routing routes
您应该在页面或帖子的对象中具有 seolink 或 permalink 属性。然后,您只需对将返回该属性的帖子或页面模型使用 to_param 方法。
to_param 方法用于*_path 方法,当您向它们传递对象时。
因此,如果您的帖子标题为“foo bar”,seolink 为“baz-quux”,您可以在模型中定义 to_param 方法,如下所示:
def to_param
seolink
end
然后,当您执行post_path(@post) 之类的操作时,您将获得/posts/baz-quux 或您在config/routes.rb 文件中配置的任何其他相关网址(我的示例适用于资源丰富的网址)。在控制器的show 操作中,您只需使用find_by_seolink 而不是find[_by_id]。
【讨论】:
我个人更喜欢这样做:
将以下内容放入您的 Post 模型中(将其粘贴在结束“结束”标签之前的底部)
def to_param
permalink
end
def permalink
"#{id}-#{title.parameterize}"
end
就是这样。您不需要更改任何 find_by 方法。这为您提供了“123-title-of-post”形式的 URL。
【讨论】:
修改模型中的to_param 方法确实是需要/方便的,就像其他人已经说过的那样:
def to_param
pagename.parameterize
end
但是为了找到帖子,您还需要更改控制器,因为默认的 Post.find 方法搜索 ID 而不是页面名称。对于显示动作,您需要这样的东西:
def show
@post = Post.where(:pagename => params[:id]).first
end
其他操作方法也是如此。
您的路由规则可以与带有 ID 号的常规路由保持相同。
【讨论】:
对于用户友好的永久链接,您可以使用 gem 'has_permalink'。更多详情http://haspermalink.org
【讨论】:
您可以使用friendly_id gem。不需要特殊的控制器更改。只需将属性(例如 slug)添加到您的模型中。有关更多详细信息,请查看 gem 的 github 存储库。
【讨论】: