我目前正在开发使用Ruby on Rails的一个博客系统,并希望用户来定义自己的“固定链接”为静态页面或博客文章,意思是:固定链接使用Ruby on Rails的(动态路由)
用户应能够设置页面名称,例如。 “测试文章”(应通过/ posts/test-article提供) - 我如何在rails应用程序和路由文件中实现这一点?
我目前正在开发使用Ruby on Rails的一个博客系统,并希望用户来定义自己的“固定链接”为静态页面或博客文章,意思是:固定链接使用Ruby on Rails的(动态路由)
用户应能够设置页面名称,例如。 “测试文章”(应通过/ posts/test-article提供) - 我如何在rails应用程序和路由文件中实现这一点?
修改在模型中to_param
方法确实需要/方便,像其他人已经说了:
def to_param
pagename.parameterize
end
但为了找到你还需要改变控制器的职位,因为默认Post.find
方法搜索ID而不是页面名称。对于展会行动,你需要这样的事情:
def show
@post = Post.where(:pagename => params[:id]).first
end
其他行动方法也一样。
您的路由规则可以保持与具有ID号的常规路由相同。
你应该在页面或者帖子的对象中拥有seolink或者permalink属性。然后,您只需使用to_param
方法来发送您的帖子或页面模型,以返回该属性。
to_param
方法用于*_path
方法,当您将它们传递给对象时。
所以,如果您的文章标题有“富巴”和seolink“巴兹 - QUUX”,你在模型中定义一个to_param
方法是这样的:
def to_param
seolink
end
然后当你这样做post_path(@post)
你会得到/posts/baz-quux
或您在config/routes.rb
文件中配置的任何其他相关网址(我的示例适用于资源丰富的网址)。在您的控制器的show
操作中,您只需要find_by_seolink
而不是find[_by_id]
。
我个人更喜欢做这种方式:
放入后你的模型如下(在关闭“结束”标签前的底部贴吧)
def to_param
permalink
end
def permalink
"#{id}-#{title.parameterize}"
end
就是这样。您不需要更改任何find_by方法。这为您提供了“123-title-of-post”形式的URL。
为用户友好的永久链接,你可以使用宝石'has_permalink'。欲了解更多详情http://haspermalink.org
您可以使用friendly_id宝石。没有需要特殊的控制器更改。简单地添加一个属性,例如slu to给你的模型..更多细节请参阅gem的github回购。
这是糟糕的SEO实践,因为谷歌认为URL中的第一个词比后者更重要 – Houen 2011-06-30 08:14:27
@Houen您是否建议删除ID?当然,一些额外的数字不会有太大的区别/你有任何链接,使这个更清晰的东西?这是所有搜索引擎相同(雅虎,冰等)感谢 – stephenmurdoch 2011-06-30 11:40:55
它的acutally没有太多关于数字,因为它是关于字数,并且短划线被视为由谷歌分词。第一个单词带有最重的SEO权重。对不起,没有提到这一点,这是发言者在Google IO 2010上告诉我们的 – Houen 2011-06-30 12:22:57