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

Ell*_*iot 36 ruby-on-rails

我一直在努力让我的Rails创建URL来显示记录,方法是使用标题而不是URL中的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
Run Code Online (Sandbox Code Playgroud)

创建帖子时,标题的URL友好版本存储在数据库的slug列中.

我们还必须使用slug列更新查找以查找记录,而不是使用ID.

class ProjectsController < ApplicationController
  def show
    @project = Project.find_by_slug!(params[:id])
  end
end
Run Code Online (Sandbox Code Playgroud)

此时它似乎工作除了显示记录,因为find_by_slug!还不存在.

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

dea*_*rds 19

这不一定是你问题的直接答案,但是你看过Stringex插件(http://github.com/rsl/stringex)吗?这是为您的记录自动创建slugs的好方法.

您可以在模型中添加以下内容:

class Post < ActiveRecord::Base
  acts_as_url :title
end
Run Code Online (Sandbox Code Playgroud)

它将从你的标题中自动创建slug并将其保存到slug列.

它的创造方式也非常聪明.例如,标题为"10%折扣,仅限今天"变成"仅限今天10%折扣".

很漂亮!


jdl*_*jdl 13

find_by_foo不是您需要定义的东西.只要你有一个名为"foo"的列,ActiveRecord就会为你服用.像你一样添加感叹号将导致在没有找到记录时抛出异常,而不是在不使用感叹号的情况下返回nil而没有异常.

至于你的具体问题,你把你的slug添加到Post,但你正在尝试搜索Project.