将after_validation与if或子句一起使用

时间:2012-08-20 08:08:07

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

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

我正在使用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?

提前致谢。

3 个答案:

答案 0 :(得分: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

如果您需要在多次验证中使用相同的复合条件,这可能(或可能不)更好地阅读并且非常方便。

答案 1 :(得分:3)

  

:if - 指定要调用的方法,proc或字符串,以确定是否应进行验证(例如:if =&gt;:allow_validation,或:if =&gt; Proc.new {| user | user.signup_step&gt; 2})。方法,proc或string应该返回或计算为true或false值。

所以试试proc:

if: Proc.new { |a| a.address_changed? || a.zipcode_changed? }

答案 2 :(得分:0)

你可以使用:if

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

或者您也可以使用lambda

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