我有一个有多个验证的对象。rails 3,如果在验证失败时在对象上设置一个值
要点审批模式:https://gist.github.com/1579150(侧面说明,我知道电子邮件域Validor不工作...)
的观点是,如果这些验证失败,我希望对象保存,但然后在approval.issue = true上设置一个值。 Approval.issue是一个默认为false的布尔型字段,但如果对象未通过验证,我希望系统管理员能够看到它,然后正确处理它。
为了使它更加白痴的证明,这将是很高兴有一些验证,可以强制用户进行更改,但其中一些将被豁免,并只会触发.issue字段为true。
例如,如果电子邮件是正确的域但电子邮件不存在系统中,它会保存它,但然后设置issue => true。然后,我可以为Approvals建立一个简单的视图,其中:issue =>:true。那么管理员可以修改或删除不合格的审批。
想法?从要点
代码:
class Approval < ActiveRecord::Base
class ApproverEmailValidator < ActiveModel::EachValidator
def validate_each(approval, attribute, value)
approval.errors[attribute] << "must be a valid e-mail address in our system" unless is_valid_email?(value)
end
protected
def is_valid_email?(address)
User.find_by_email(address)
end
end # End Approver Validator
class EmailDomainValidator < ActiveModel::EachValidator
def email_domain_is?(domain)
unless /ravennainteractive.com$/ =~ email(domain)
errors.add(:email, "You must Use an Eddie Bauer email address")
end
end
end #End Email Domain Validator
belongs_to :recommendation
attr_accessible :approval, :email, :user_id
validates :email, :email_domain
validates :next_approver_email, :approver_email => { :if => :recently_approved? }
before_save :create_next_approval
after_create :approval_notification
attr_accessor :next_approver_email
def recently_approved?
self.approved_changed? && self.approved?
end
def create_next_approval
next_approval = self.recommendation.approvals.build(:email => self.next_approver_email, :user_id => User.find_by_email(next_approver_email))
next_approval.save if next_approver_email.present? && recently_approved?
end
def email_domain_is?
unless /ravennainteractive.com$/ =~ email
errors.add(:email, "You must Use an Eddie Bauer email address")
end
end
private
def approval_notification
ApprovalMailer.needs_approval(self).deliver
end
end
感谢编辑在impementing这将是真棒iWasRobbed – 2012-01-08 18:50:51