0

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

4

2 回答 2

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异常,而只是 return nil。考虑使用Entry.find_by_slug!(params[:id]).

  3. 如果你真的希望你的路线看起来像这样/title-of-entry,你以后可能会遇到问题。如果 entry slug 看起来与另一个控制器的名称相同,路由器可能会得到意想不到的结果。

于 2012-08-02T04:48:37.073 回答
1

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

友好ID

安装很简单,您将在几分钟内启动并运行。试一试。

于 2012-08-02T11:42:37.853 回答