2012-11-20 4 views
0

그래서 1) 변경 사항을 저장하지 않고 대신 2) 이러한 변경 사항으로 감사를 저장해야합니다. 두 번째 부분은 send_for_audit 메서드에 의해 수행되지만 false를 반환하면 새 Audit 인스턴스가 만들어지지 않고 Article 인스턴스에 대한 변경 내용이 저장되지 않습니다 (단순화 된 코드가 있음).before_save 콜백에서 모델 변경 저장을 방지하는 방법

class Article < ActiveRecord::Base  
    before_save :send_for_audit, if: :changed? 
    has_many :audits, as: :auditable 

    private 

    def send_for_audit 
    audits.destroy_all 
    Audit.create!(auditable: self, data: changes) 
    end  
end 

class Audit < ActiveRecord::Base 
    attr_accessible :auditable, :auditable_id, :auiditable_type, :data 
    store :data 
    belongs_to :auditable, polymorphic: true 

    def accept 
    object_class = self.auditable_type.constantize 
    object = object_class.find_by_id(auditable_id) 
    data.each do |attr, values| 
     object.update_column(attr.to_sym, values.last) 
    end 
    self.destroy 
    end 
end 

나는 그들이 트리거되는 순서가 트릭을 할 것입니다 생각 추가 before_save 콜백 추가 시도했다 :

before_save :send_for_audit, if: :changed? 
before_save :revert_changes 

def send_for_audit 
    audits.destroy_all 
    Audit.create!(auditable: self, data: changes) 
    @need_to_revert = true 
end 

def revert_changes 
if @need_to_revert 
    @need_to_revert = nil 
    false 
end 
end 

을하지만 어쨌든 내가 더 감사 예 .. 어떤 생각 없어 어떻게 내가 원하는 결과를 얻을 수 있을까?

답변

0

나는 업데이트 컨트롤러 액션에이 방법을 사용하여 다음 난 그냥 before_save를 사용 해달라고을 알아 냈하지만

def audited_save!(current_user) 
    if current_user.superadmin 
     save! 
    else 
     audits.destroy_all 
     Audit.create!(auditable: self, data: changes) 
    end 
    end 

와 한

관련 문제