2009-10-23 5 views
55

私はレールを2.3.4にアップグレードしましたが、検証でこれを確認しました: 名前を持つシンプルなモデルの会社があるとしましょう。それに何もない。 私は自分自身の検証を実行したい:モデルを保存Railsでカスタム検証メソッドを呼び出す

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

は、実際にこのケースで動作します。 validate()をオーバーライドしてfalseを返すと同じことが起こります。 私は検証が偽を返していたより複雑なモデルでこれに気付きましたが、オブジェクトはまだ保存していました...私は本質的に空のモデルで試してみました。私が行方不明の新しい練習はありますか?これは私の古いレールコードの中には当てはまらないようです。

+0

に置き換えられてしまいました。それはほとんど間違いなく事実です。新しいプロジェクトではエラーを追加するのを忘れていましたが、古いプロジェクトでは間違いなくそこにいました。ダー。皆さん、ありがとうございました。 – cgr

答えて

107

validateメソッドを使用すると、検証が実行されます。しかし、レールは戻り値に依存しません。

検証にエラーがあるかどうかは、依存しています。したがって、モデルが検証しないときにエラーを追加する必要があります。

def something 
    errors.add(:field, 'error message') 
end 

あるいは、エラーがフィールドに関連していない場合:

def something 
    errors.add(:base, 'error message') 
end 

エラーがあるので、次に、あなたのモデルが保存されません。

+0

、ありがとう!これは役に立ちます – marcgg

+0

add_to_baseはRails 3の時点ではもう正しくありません。@ MagedMakledの答えをご覧ください。 – Undistraction

+0

私はちょうど答えを更新しました。ありがとうございました。 –

14

検証とコールバックの間に混乱が生じています。

オブジェクトにエラーがある場合、検証は失敗すると考えられますが、検証が返すものは関係ありません。オブジェクトにエラーが追加されても、falseを返すとコールバックは失敗します。

Railsは通話を有効にしていますか?バリデーションの結果をチェックしないセーブコールから。

編集: Railsはコールバックとしてvalidate :methodを処理しますが、有効ですか?依然として結果をチェックするのではなく、オブジェクトに追加したエラーについてのみチェックします。

この動作がまったく変わったとは思えませんが、間違っている可能性があります。私は前にfalseを返す妥当性を書いたとは思わない。

+1

new_recordsの検証を作成しようとしていたので、コールバックObj.before_validation_on_createで使用するメソッドを作成し、いくつかの基本エラーを追加しました。ただし、コールバックが基本エラーを追加した場合でもオブジェクトが作成されます。あなたが提案したように私のコールバックが「偽」になったときにのみ機能しました!コールバックが失敗する方法を指摘してくれてありがとう – Coderama

8

だけFYI errors.add_to_base('error message')はありがとうレール3に廃止され、

errors[:base] << "Error message" 

それとも

errors.add(:base, "Error message") 
関連する問題