我有一个模型,根据其当前状态需要不同的验证器。我应该如何为每个实例调用 ActiveRecord 验证器?我想尽可能多地重复使用管道,但我不知道如何继续。
class Order < ActiveRecord::Base
attr_accessible :state
validate :state_specific_validations
def state_specific_validations
if :paid == self.state
# Warning: here be Unicorns...
# Wishful thinking...
validate_presence_of :paid_at
validate_associated :purchaser
# Hopeful. What are the validators called internally in Rails?
errors << PresenceValidator.new(self, :paid_at).valid?
errors << AssociationValidator.new(self, :paid_at).valid?
# Plan B
# ... Hoping for help from the audience ...
else
# Even more complicated validator logic, hoping for some DRY validators
end
end
end
我可以只使用自定义验证器,但为什么我需要复制所有内置验证器逻辑(国际化错误消息等)?
有没有一种巧妙的方法来调用 Rails 验证器作为实例方法?
我认为 Sequel 基于实例的验证器方法比 ActiveRecord 基于类的方法更合理,但我不在这里做出判断。我只是想回去解决更有趣的问题。我只是希望其他人也遇到过这个问题,并能为我指出一些有趣的要点或宝石。
我很确定所有的validate_*
方法可以采取:if
选项 - 它可以指向另一个方法(并且也可能接受 Proc),因此您可以将验证分解为更像:
validates_presence_of :paid_at, :if => :paid?
validates_association :purchaser, :if => :paid?
为了进一步清理事情,有 with_options 帮助器:
with_options :if => :paid? do |v|
v.validates_presence_of :paid_at
v.validates_association :purchaser
end
不确定是否可以与标准一起使用validate :custom_validate_method
虽然——但这不会让我感到惊讶。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)