使用rails_admin在after_save回调中使用previous_changes

时间:2015-05-21 04:35:43

标签: rails-admin

我有一个after_save回调,它使用previous_changes方法来测试字段更改。当我在rails控制台中保存记录时,它工作正常,但是当我尝试在rails_admin中触发它时,无法识别该字段已更改。

  def mailers
  if previous_changes['pending_approval'] == [false, true]
    ProjectMailer.project_owner_new_project(self).deliver_later
    Rails.logger.debug("Changed Pending to False!!".green)
  end
  Rails.logger.debug("hit project mailer callback".red)
end

在这个例子中,当在控制台中运行时(记录刚刚将pending_approval从true更改为false),我得到两条记录的消息; "等待改为False !!"和"点击项目邮件回调"

当我更改rails_admin中的状态时,我只得到第二个"命中项目邮件程序回调。"这让我相信rails_admin正在做一些干扰我的记录的Dirty类处理的事情。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是将after回调更改为before并使用self_attribute_changed?(from:true,to:false),如下所示:

  def mailers
    if self.pending_approval_changed?(from: true, to: false)
      ProjectMailer.project_owner_new_project(self).deliver_later
      Rails.logger.debug("Changed Pending to False!!".green)
    end
    Rails.logger.debug("hit project mailer callback".red)
  end

我认为采用相同策略的另一种方法是使用像这样的around_save

  def mailers
    changed = self.pending_approval.changed?(from: true, to: false)
    yield
    if changed
      ProjectMailer.project_owner_new_project(self).deliver_later
      Rails.logger.debug("Changed Pending to False!!".green)
    end
    Rails.logger.debug("hit project mailer callback".red)
  end  

我尝试了第一种方式,它适用于我的情况。 Haven没有通过第二种方式进行测试。