我有一个类别模型。我想确保用户不会在他/她的类别列表中添加重复的类别名称。
这是我的类别模型:
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添加错误。以上是我的尝试,但似乎没有通过,有什么明显的错误吗?此外,这是添加自定义验证的良好做法吗?
答案 0 :(得分:5)
这是实现目标的一种更简单的方法 - 您可以使用validates_uniqueness_of
验证程序的scope
选项:
validates_uniqueness_of :name, scope: :user_id
您的规范失败,因为它有错误。它期望new_category
有错误,但它不会对此对象运行验证。要做到这一点,你只需要添加:
new_category.valid?
在expect#...
行之前。