我有一个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类处理的事情。有更好的方法吗?
答案 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没有通过第二种方式进行测试。