我一直在尝试让我的Rails创建网址来显示记录,方法是使用标题而不是网址中的ID,例如:
/帖/ A-后约-火箭
在线教程后,我做了以下工作:
由于ID不再在URL中,我们必须稍微更改一下代码。
class Post < ActiveRecord::Base
before_create :create_slug
def to_param
slug
end
def create_slug
self.slug = self.title.parameterize
end
end
创建帖子后,标题的URL友好版本将存储在数据库的slug列中。
我们还必须使用slug列更新查找以查找记录,而不是使用ID。
class ProjectsController < ApplicationController
def show
@project = Project.find_by_slug!(params[:id])
end
end
此时它似乎工作,除了显示记录,因为find_by_slug!还不存在。
我是一个极端的新手 - 我应该在哪里定义它?
答案 0 :(得分:19)
这不一定是你问题的直接答案,但是你看过Stringex插件(http://github.com/rsl/stringex)了吗?这是为您的记录自动创建slugs的好方法。
您只需在模型中添加以下内容:
class Post < ActiveRecord::Base
acts_as_url :title
end
它将自动创建标题中的slugs并将其保存到slug列。
它的创造方式也非常聪明。例如,“仅限今天10%折扣”的标题将变成“今天仅限10%折扣”。
漂亮的光滑!
答案 1 :(得分:13)
find_by_foo不是您需要定义的东西。只要你有一个名为“foo”的列,ActiveRecord就会为你服用。如果没有找到记录,那么像你一样添加感叹号将导致抛出异常,而不是在没有使用感叹号的情况下返回nil而没有异常。
至于你的具体问题,你把你的slug添加到Post,但是你正在尝试搜索Project。
答案 2 :(得分:2)
Stringex gem非常适合生成slug本身,但我不同意将它保存在数据库中是一个好主意。你需要记住,如果与slug相关的东西发生了变化,你需要更新你的slug列。 E一致。
最后,它是重复的信息,无论以何种形式。我正是因为这个原因写了一篇文章。
http://blog.ereslibre.es/?p=343
我希望这篇文章有所帮助。我试着解释那里的一切。