59

以下を使用してオブジェクトに検証を追加しました。

validate :field, presence: true

エラーメッセージが表示されないことがわかりました。私はそれらをに変更しvalidates、エラーメッセージを受け取りました。このチケットは該当します。

でカスタム検証を追加しようとしましvalidatesたが、エラーが発生しました:

You need to supply at least one validation

に変更したところvalidate、すべてが期待どおりに進みました。

私の理解ではvalidates、通常の検証validateとカスタム検証で使用することです。そうですか?他に知っておくべき部分はありますか?すべてを検証するだけでなく、最初の問題を大声で失敗させる方法はありますか?

4

2 に答える 2

81

validatesこのメソッドは、すべてのデフォルト バリデータと、「Validator」で終わるカスタム バリデータ クラスへのショートカットです。Rails のデフォルト バリデーターは、PresenceValidator などのカスタム バリデーター クラスをその場所に作成することで、特定のクラス内でオーバーライドできることに注意してください。

validates :title, :body, :presence => true

validate、検証メソッドまたはブロックをクラスに追加します。これは、validate インスタンス メソッドのオーバーライドが扱いにくくなり、バリデーションのよりわかりやすい宣言を探している場合に便利です。

validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
于 2013-08-09T06:14:38.400 に答える
10

:validate宣言はカスタム検証に:validates使用され、 as はフィールドのような一般的な検証に使用されると思いますpresence, uniqueness etc

メソッドは、パラメータの名前を持つメソッドを探します。validateつまり、そうすると、validate :field

def field 

end

あなたのobject。Rails はattr_accessorすべてのデータベースに対して を定義しているためfield、はのリーダー メソッドvalidate :fieldを呼び出します。field

検証関数が返された場合、trueまたはerrorオブジェクトが存在する場合、つまりobject.errors空でない場合、オブジェクトは考慮されますvalid?

したがって、問題の理由は、彼らは検証ligthouseについて不平を言う:)validate silently bypasses

これが理にかなっていることを願っています

于 2013-08-09T06:28:01.590 に答える