2012-01-08 67 views
1

我有一个有多个验证的对象。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 
+0

感谢编辑在impementing这将是真棒iWasRobbed – 2012-01-08 18:50:51

回答

0

您可以实现观察员批准,将分析你保存和设置问题之前,对象为“true”,如果有一些可疑的输入。

更新:这里是短指南如何实现观察者:

  1. 轨产生观察者 - 这一步后您`ll看到_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 
    

而且你需要将它添加到你的config/application.rb中,使观察者,例如:

config.active_record.observers = :homework_observer 

官方文档:http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

+0

任何方向。我认为这是正确的方向。从来没有做过观察员 – 2012-01-08 19:09:29

相关问题