Ruby on Rails的永久链接(动态路由)

我目前正在使用Ruby on Rails开发一个博客系统,并希望用户为静态页面或博客post定义他的“永久链接”,这意味着:

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

确实需要/方便地修改模型中的to_param方法,就像其他人已经说过的那样:

 def to_param pagename.parameterize end 

但是为了找到post,你还需要更改Controller,因为默认的Post.find方法搜索ID而不是pagename。 对于show动作,你需要这样的东西:

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

其他动作方法也是如此。

路由规则可以与具有ID号的常规路由保持一致。

对于用户友好的永久链接,您可以使用gem’has_permalink’。 有关详细信息,请访问http://haspermalink.org

我个人更喜欢这样做:

将以下内容放入Post模型中(在结束’end’标记之前将其粘贴在底部)

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

而已。 您无需更改任何find_by方法。 这将为您提供“123-title-of-post”forms的URL。

您可以使用friendly_id gem。 不需要特殊的控制器更改。 简单地将一个属性(例如slug)添加到模型中。有关更多详细信息,请查看gem的github repo。

#63和#117的轨道广播剧集可能会对你有所帮助。 还要查看那里的资源。

您应该在页面’或post’对象中具有seolink或永久链接属性。 然后你只需要使用to_param方法为你的post或页面模型返回该属性。

当你传递一个对象时, to_param方法用在*_path方法中。

因此,如果你的post有标题“foo bar”和seolink“baz-quux”,你可以在模型中定义一个to_param方法,如下所示:

 def to_param seolink end 

然后,当你执行类似post_path(@post)你将获得/posts/baz-quux或你在config/routes.rb文件中config/routes.rb任何其他相关url(我的例子适用于资源丰富的url)。 在控制器的show动作中,你只需要find_by_seolink而不是find[_by_id]