2

誰かが私を正しい方向に向けてくれませんか。

ジオコーディングと競合するためにafter_validationを使用していますが、または||を操作する方法を知りたいと思いました。if句のオプション。

これは意図したとおりに機能します

class Address < ActiveRecord::Base

after_validation :geocode, if: :address_changed?

しかし、これはしません

class Address < ActiveRecord::Base

after_validation :geocode, if: :address_changed? || :zipcode_changed?

前もって感謝します。

4

3 に答える 3

5

Thiloのアプローチを使用したくない場合はProc、独自のカスタムメソッドを追加して、それを使用できます。

class Address < ActiveRecord::Base
  after_validation :geocode, if: :address_or_zip_changed?
private
  def address_or_zip_changed?
    address_changed? || zipcode_changed?
  end
end

これは読みやすくなる場合もあれば、そうでない場合もあり、複数の検証で同じ複合条件が必要な場合に便利です。

于 2012-08-20T08:25:11.027 に答える
3

:if-検証を実行するかどうかを決定するために呼び出すメソッド、proc、または文字列を指定します(例::if =>:allow_validation、または:if => Proc.new {| user | user.signup_step> 2})。メソッド、proc、または文字列は、trueまたはfalseの値を返すか評価する必要があります。

だからprocを試してみてください:

if: Proc.new { |a| a.address_changed? || a.zipcode_changed? }
于 2012-08-20T08:16:33.727 に答える
0

:ifを使用してこれを行うことができます

validates :email, :unique=> true, :if => Proc.new { email.present? }

または、ラムダを使用することもできます

validates :email, :unique=> true, :if => lambda { email.present? }
于 2012-08-20T08:26:30.850 に答える