如何防止在before_save回调中保存模型更改

时间:2012-11-20 12:16:16

标签: ruby-on-rails-3 before-save

所以我必须1)不保存更改,而是2)使用这些更改保存审核。第二部分是通过send_for_audit方法实现的,但是如果我在其中返回false,则不会创建新的Audit实例,也不会保存对Article实例的更改(存在简化的代码)。

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

但无论如何我没有审计实例.. 有什么想法,我怎么能达到预期的结果?

1 个答案:

答案 0 :(得分: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

然后我在更新控制器操作中使用该方法