这是我的模特:
class Goal < ActiveRecord::Base
belongs_to :user
validate :progress_is_less_than_max
private
def progress_is_less_than_max
if progress > max
errors.add(:progress, "should be less than max")
end
end
end
如果我进入控制台并执行
some_user.goals.create! :name => 'test', :max => 10, :progress => 15, :unit => 'stuff'
它保存得很好,没有任何错误。我做得不对劲?
答案 0 :(得分:0)
嗯,这不是你编写自定义验证器的方式:你的自定义验证器应该继承自ActiveModel::EachValidator
。
请参阅此rails cast的底部以获取客户验证器的示例:http://railscasts.com/episodes/211-validations-in-rails-3?view=asciicast
答案 1 :(得分:0)
@jaydel是正确的.create将返回模型的一个实例(无论它是否保存在数据库中)。
如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库。无论对象是否已成功保存到数据库,都会返回结果对象。
然而,调用.save!在.create'd模型上或调用.create!如果验证失败,则开始将引发异常。
创建一个与ActiveRecord :: Base.create类似的对象,但调用save!而不是保存,因此如果记录无效,则会引发异常。
.save将运行验证,但如果失败则返回false。
默认情况下,保存始终运行验证。如果其中任何一个失败,则取消操作并保存返回false。但是,如果您提供:validate =&gt;错误,完全绕过验证。有关详细信息,请参阅ActiveRecord :: Validations。