为什么我的自定义验证不在Rails中运行?

时间:2011-12-06 09:16:01

标签: ruby-on-rails ruby-on-rails-3 validation

这是我的模特:

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'

它保存得很好,没有任何错误。我做得不对劲?

2 个答案:

答案 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。