我正在使用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
的工作原理。
答案 0 :(得分:2)
你可以试试这个......
before_validation :renter, if: :check_renter?
def check_renter?
resident? && active? && unit.present? && units.empty?
end
答案 1 :(得分:0)
我的第二个怀疑是正确的。 before_validation
期待真实或虚假。
答案 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