2010-01-16 228 views
4

我目前正在开发使用Ruby on Rails的一个博客系统,并希望用户来定义自己的“固定链接”为静态页面或博客文章,意思是:固定链接使用Ruby on Rails的(动态路由)

用户应能够设置页面名称,例如。 “测试文章”(应通过/ posts/test-article提供) - 我如何在rails应用程序和路由文件中实现这一点?

回答

3

修改在模型中to_param方法确实需要/方便,像其他人已经说了:

def to_param 
    pagename.parameterize 
end 

但为了找到你还需要改变控制器的职位,因为默认Post.find方法搜索ID而不是页面名称。对于展会行动,你需要这样的事情:

def show 
    @post = Post.where(:pagename => params[:id]).first 
end 

其他行动方法也一样。

您的路由规则可以保持与具有ID号的常规路由相同。

0

你应该在页面或者帖子的对象中拥有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]

2

我个人更喜欢做这种方式:

放入后你的模型如下(在关闭“结束”标签前的底部贴吧)

def to_param 
    permalink 
end 

def permalink 
    "#{id}-#{title.parameterize}" 
end 

就是这样。您不需要更改任何find_by方法。这为您提供了“123-title-of-post”形式的URL。

+0

这是糟糕的SEO实践,因为谷歌认为URL中的第一个词比后者更重要 – Houen 2011-06-30 08:14:27

+0

@Houen您是否建议删除ID?当然,一些额外的数字不会有太大的区别/你有任何链接,使这个更清晰的东西?这是所有搜索引擎相同(雅虎,冰等)感谢 – stephenmurdoch 2011-06-30 11:40:55

+0

它的acutally没有太多关于数字,因为它是关于字数,并且短划线被视为由谷歌分词。第一个单词带有最重的SEO权重。对不起,没有提到这一点,这是发言者在Google IO 2010上告诉我们的 – Houen 2011-06-30 12:22:57

1

这个#63#117集的railscasts可能会帮助你。还要检查那里的资源。

2

您可以使用friendly_id宝石。没有需要特殊的控制器更改。简单地添加一个属性,例如slu to给你的模型..更多细节请参阅gem的github回购。