ActiveRecord :: Base before_validation,条件未触发

时间:2016-06-09 18:55:49

标签: ruby-on-rails ruby activerecord

我正在使用before_validation来确保我的User模型的状态。

before_validation :renter, if: 'resident? && active? && unit.present? && units.empty?'

当我尝试使用新记录时,条件成立。

user.resident? && user.active? && user.unit.present? && user.units.empty?
=> true

并且回调在没有条件的情况下完美运行。

但是,使用带有条件的回调不起作用。

user = User.new(resident_attr_except_resident_type)
user.save
=> false
user.errors.full_messages
=> ["Resident type can't be blank"]

user.renter
=> #<User ..., resident_type: 0> # resident_type 0 because is a enum
user.save
=> true

为了澄清,renter方法执行以下操作:

def renter
  self.resident_type = :renter
  self
end

def renter!
  renter.save
end

我有什么遗失的吗?

我怀疑有两件事,1)条件和2)renter的回报,我误解了before_validation的工作原理。

3 个答案:

答案 0 :(得分:2)

你可以试试这个......

before_validation :renter, if: :check_renter?

def check_renter?
  resident? && active? && unit.present? && units.empty?
end

答案 1 :(得分:0)

答案 2 :(得分:0)

IMO您的回调和renter方法很难阅读和理解。我认为将该代码单独转移到一个方法中是值得的:

before_validation :determine_renter_type

private
def detemine_renter_type
  if resident? && active? && unit.present? && units.empty?
    self.renter_type = User.renter_types[:renter]
  end

  self # avoid aborting the save process by returning a truthy value
end
相关问题