2011-12-06 10 views
2

これは私のモデルである:私のカスタム検証がRailsで動作しないのはなぜですか?

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

あなたのユーザーは「has_many」の目標を持っていますか?つまり、Userモデルの 'has_many'メソッドとの関連付けを明示的に指定していますか? – maprihoda

+0

作成してみてください(作成しないでください) – Dorian

+0

@Dorian、作成して保存してください!予想されるエラーがスローされます。ありがと...とどのように混乱しています。 – Koquillion

答えて

0

これは、カスタムバリデータの書き方ではありません。カスタムバリデータはActiveModel::EachValidatorから継承する必要があります。

これの底部は、顧客のバリデータの例については、キャストレールを参照してください:かかわらず、それはデータベースに保存されている場合の(モデルのインスタンスを返したりしますhttp://railscasts.com/episodes/211-validations-in-rails-3?view=asciicast

+0

いいえ、彼の方法はうまくいくはず、私の作品:https://github.com/Ung-UTT/Site-etu-v9/blob/master/app/models/vote.rb – Dorian

0

@jaydelはその.createに正しいですない)。

オブジェクト(または複数のオブジェクト)を作成し、検証が合格するとデータベースに保存します。オブジェクトがデータベースに正常に保存されたかどうかにかかわらず、結果のオブジェクトが返されます。

ただし、.save! .create'dモデルで作成するか、.create!検証が失敗した場合には、例外が発生します。

ActiveRecord :: Base.createのようにオブジェクトを作成しますが、save! saveの代わりにレコードが無効な場合は例外が発生します。

.saveは検証を実行しますが、失敗した場合はfalseを返します。

デフォルトでは、保存は常に検証を実行します。いずれかが失敗した場合、アクションは取り消され、saveはfalseを返します。しかし、あなたが:validate => falseを指定した場合、検証はまったくバイパスされます。詳細については、ActiveRecord :: Validationsを参照してください。

関連する問題