URL中的Rails slug - 使用Active Record Model Post的Title属性而不是ID

时间:2009-08-09 22:38:23

标签: ruby-on-rails

我一直在尝试让我的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!还不存在。

我是一个极端的新手 - 我应该在哪里定义它?

3 个答案:

答案 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

我希望这篇文章有所帮助。我试着解释那里的一切。