before_validation以防止重复的类别名称

时间:2014-03-19 14:07:13

标签: ruby-on-rails

我有一个类别模型。我想确保用户不会在他/她的类别列表中添加重复的类别名称。

这是我的类别模型:

class Category < ActiveRecord::Base
  belongs_to :user

  validates :name, presence: true
  validates :user_id, presence: true
  before_validation :validate

  private
    def validate
      errors.add(:name, "is already taken") if Category.where("name = '?' AND user_id = ?", self.name, self.user_id).any?
    end
end

这是我的RSpec测试:

it "is invalid with duplicate name for same user" do
  existing_category = Category.first
  new_category = Category.new(:name => existing_category.name, :user_id => existing_category.user_id)
  expect(new_category).to have(1).errors_on(:name)
end

我应该使用before_save还是before_validate?另外,我不确定如何写这个。我想如果检测到重复,我想为:name添加错误。以上是我的尝试,但似乎没有通过,有什么明显的错误吗?此外,这是添加自定义验证的良好做法吗?

1 个答案:

答案 0 :(得分:5)

这是实现目标的一种更简单的方法 - 您可以使用validates_uniqueness_of验证程序的scope选项:

validates_uniqueness_of :name, scope: :user_id

您的规范失败,因为它有错误。它期望new_category有错误,但它不会对此对象运行验证。要做到这一点,你只需要添加:

new_category.valid?

expect#...行之前。