У меня есть объект с несколькими проверками.
Суть модели утверждения: https://gist.github.com/1579150 (примечание: я знаю, что валидатор домена электронной почты не работает ...)
Смысл в том, что если эти проверки не пройдены, я хочу сохранить объект, но затем установить значение для Approval.issue = true. Approval.issue - это логическое поле, которое по умолчанию имеет значение false, но затем, если объект не проходит валидацию, я хочу, чтобы системный администратор смог его увидеть и затем обработать соответствующим образом.
Чтобы сделать его более идиотским доказательством, было бы неплохо иметь некоторые проверки, которые могут заставить пользователя вносить изменения, но некоторые из них будут освобождены и просто приведут к тому, что поле .issue станет истинным.
Например, если электронная почта относится к нужному домену, но электронная почта не существует в системе, она сохранит его, но затем установит Issue => True. Затем я мог бы настроить простой вид для утверждений, где: 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