5

trueの場合、私はdescription属性を持つOrderモデルを持っています。私は、現在のステップが最初のステップと等しい場合、またはrequire_validationがtrueに等しい場合、2つの条件の1つが満たされた場合にのみ、その存在を検証したいと考えています。Railsの - 検証:1つの条件がRailsの5</p> <p>で

私は簡単にこのような一つの条件に基づいて検証することができます:

validates :description, presence: true, if: :first_step? 

def first_step? 
current_step == steps.first 
end 

が、私は別の条件を追加すると、どちらか一方がtrueの場合、検証については移動する方法がわからないです。

何かのように:

validates :description, presence: true, if: :first_step? || :require_validation 

ありがとう!

答えて

7

あなたはif:句のためのラムダを使用し、又は状態を行うことができます。

validates :description, presence: true, if: -> {current_step == steps.first || require_validation} 
3

1つの方法でラッピングできますか? docs

によると:場合 - メソッド、PROCまたは文字列を指定し、検証が発生した場合(判断するためにコールするなどの場合:allow_validation、または場合:Proc.new {|ユーザー| user.signup_step> 2})。メソッド、proc、またはstringはtrueまたはfalseの値を返すか、評価する必要があります。

validates :description, presence: true, if: :some_validation_check 

def some_validation_check 
    first_step? || require_validation 
end 
1

あなたはジャレッドように、1つの方法を追加したくない場合は、あなたがあなたがif条件として評価されるラムダを渡すことができ、使用のラムダ

validates :description, presence: true, if: ->{ first_step? || require_validation } 
2

を試すことができると言います。

validates :description, presence: true, if: -> { first_step? || require_validation }

+1

を試してみてはということは、ラムダはありませんか?ブロックは次のようになります: 'validates:description、presence:true、if:{first_step? || require_validation} ' –

+0

ああ、そうです。私は "ラムダを渡すことができる"と言っていたはずです。 –

+0

:)ブロックも機能します。 Railsはそれをprocまたはlambda(それを使用する前に何かを忘れる)に変換します。 –