使URL成为帖子的标题

时间:2012-08-02 04:29:42

标签: ruby-on-rails-3 url routes format

目前我的网址显示为www.website.com/entries/1,我想将其显示为www.website.com/title-of-entry。我一直在使用routes,并且能够在URL中显示entry标题,但Rails无法在不提供ID的情况下找到entry。如果我将ID与参数一起发送,则网址显示为www.website.com/title-of-entry?=1。无论如何我可以传递ID而不将它作为参数出现在URL中吗?谢谢!

2 个答案:

答案 0 :(得分:1)

通常,您希望将此部分保存在数据库title-of-entry中(调用字段slug或其他内容)。你的模型看起来像这样:

class Entry < ActiveRecord::Base

  before_validation :set_slug

  def set_slug
    self.slug = self.title.parameterize
  end

  def to_param
    self.slug
  end

end

现在生成的路线如下所示:/entries/title-of-entry

要查找相应的条目,您必须更改控制器:

# instad of this
@entry = Entry.find(params[:id]

# use this
@entry = Entry.find_by_slug(params[:id])

<强>更新

要记住的一些事情:

  1. 您必须确保slug是唯一的,否则Entry.find_by_slug(params[:id])将始终返回遇到此slug的第一个条目。

  2. Entry.find_by_slug(params[:id])不会引发ActiveRecord::RecordNotFound例外,而是返回nil。考虑使用Entry.find_by_slug!(params[:id])

  3. 如果您确实希望自己的路线看起来像/title-of-entry,那么您以后可能会遇到问题。如果条目slug看起来与另一个控制器的名称相同,路由器可能会得到意外的结果。

答案 1 :(得分:1)

像大多数事情一样,这是一个宝石。

FriendlyID

安装非常简单,您可以在几分钟内启动并运行。给它一个旋转。