0

我正在使用 Ruby on Rails 版本 3.2.13。

这是我的模型定义:

module Recipes
  class Recipe < ActiveRecord::Base
    include ApplicationHelper

    attr_accessible :body, :title, :author, :photos, :tags

    has_many :photos
    has_many :favorites
    has_many :taggings
    has_many :tags, :through => :taggings

    belongs_to :author,
               :class_name => :User,
               :foreign_key => :author_id

    before_create :default_values
    before_save :create_slug

    validates_presence_of :title, :body, :author
    validates_uniqueness_of :title, :slug

    def create_slug
      self.slug = ApplicationHelper.slugify(self.title)
    end

    def default_values
      self.view_count ||= 0
    end
  end
end

如果我创建一个标题为“Test Title #1”的记录,并尝试创建另一个标题为“Test Title #1”的记录,我会收到一个验证错误,说明标题已被占用。如果我创建一个标题为“Test Title #1”的记录,并尝试创建另一个标题为“Test Title 1”的记录,它会成功。为两条记录生成的 slug 是相同的,“test-title-1”,这不应该发生。

这是代码slugify

module ApplicationHelper
  def self.slugify(text)
    text.gsub(/[\W]+/, " ").strip.gsub(/[\s]+/, "-").downcase
  end
end
4

1 回答 1

2

操作顺序(至少与您的模型相关)如下所示:

  1. before_validation回调。
  2. 验证。
  3. before_save回调。
  4. 保存到数据库。

您可以在Active Record 回调指南中找到完整列表。

因此,在执行验证调用您的create_slug方法(回调)。如果你想确保你的蛞蝓是独一无二的,你应该:before_save

before_validation :create_slug

以便在验证执行之前设置 slug 。

于 2013-07-04T03:59:08.507 回答