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]
。
- Rails 3 – 渴望加载条件
- 如何在非rails应用程序中使用ActiveRecord创建新的MySQL数据库?
- 带有rails的入门级javascript:更新表单提交上的div(3.1 / jquery)
- Rails灯具 – 你如何设置外键?
- Rails 5:i18n用于命名空间模型的枚举
- 如何在我的Rails项目中手动包含twitter bootstrap(不使用任何gem)?
- 有没有更简单的方式来显示$ currency格式?(特别是逗号)我可以将RE与Objective C代码集成吗?
- Paperclip错误:’avatar_file_name’需要attr_accessor所需的模型
- 如何在Ruby On Rails中按星期从星期到结束时间范围进行分组