Рельсы 3, установить значение для объекта, если он не проходит проверку - PullRequest
1 голос
/ 08 января 2012

У меня есть объект с несколькими проверками.

Суть модели утверждения: 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

1 Ответ

0 голосов
/ 08 января 2012

Вы можете внедрить наблюдателя для утверждения, который будет анализировать ваши объекты перед сохранением и установить проблему в «true», если есть подозрительные данные.

ОБНОВЛЕНИЕ: Вот краткое руководство по реализации наблюдателя:

  1. рельсы генерируют наблюдателя - после этого шага вы увидите файл _observer.rb.

  2. Реализация необходимых методов.Вот простой пример, извлеченный из одного из моих проектов (похоже, вы должны использовать метод before_save):

    class HomeworkObserver < ActiveRecord::Observer
        def after_create(homework)
            TeacherMailer.send_later(:student_submitted_homework, homework)
         end
    
         def after_save(homework)
             if (homework.checked)
                 StudentMailer.send_later(:teacher_checked_homework, homework)
             end
         end
    end
    

Также вам нужно включить наблюдателя, добавив его в вашу конфигурацию/application.rb, например:

    config.active_record.observers = :homework_observer

Официальные документы: http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...