2

有人可以指出我正确的方向。

我正在使用 after_validation 来竞争地理编码,我想知道如何处理 or || 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 - 指定要调用的方法、过程或字符串以确定是否应该进行验证(例如 :if => :allow_validation 或 :if => Proc.new { |user| user.signup_step > 2 })。方法、过程或字符串应返回或评估为真或假值。

所以尝试一个过程:

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? }

或者你也可以使用 lambda

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