目前我的 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 中吗?谢谢!
问问题
158 次
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])
更新
需要记住的几件事:
您必须确保它
slug
是唯一的,否则Entry.find_by_slug(params[:id])
将始终返回带有此 slug 遇到的第一个条目。Entry.find_by_slug(params[:id])
不会引发ActiveRecord::RecordNotFound
异常,而只是 returnnil
。考虑使用Entry.find_by_slug!(params[:id])
.如果你真的希望你的路线看起来像这样
/title-of-entry
,你以后可能会遇到问题。如果 entry slug 看起来与另一个控制器的名称相同,路由器可能会得到意想不到的结果。
于 2012-08-02T04:48:37.073 回答
1
于 2012-08-02T11:42:37.853 回答