繁体   English   中英

如何检查模型的 before_save 回调中的修改值?

[英]How to check modified value in a model's before_save callback?

如何读取控制器在 before_save 回调中设置的值?

例子:

我有一个带有url字段的模型。 在保存之前,我想检查 url 是否已更改。 如果是这样,请对新旧 url 执行一些操作。

那可能吗?

尝试这样的事情:

before_save { |m| if m.url_changed? ... }

另请参阅ActiveModel::Dirty上的文档

更好的方法

before :todo, if: :first_name_or_last_name_changed?

和你的todo方法



如果它发生了变化,它应该在params哈希中。 如果它没有改变,它不应该在那里。 因此,您可以将此自定义处理放入控制器中,或放入执行此操作的模型上的方法中。

如果您真的想在before_save访问它,请查看有关 ActiveRecord 回调的文档,您将看到如何访问之前和之后的值。

我试过这个东西,但没有成功

#Non-working code
before_save: record_old_value
after_save: record_change

def record_old_value
   @old_value = self.field
end

def record_change
   if @old_value==self.field
      create_record_in_history :old_value => @old_value, :new_value => self.field
   end
end

它没有解决的原因是因为我们设置了 self.field=new_value 所以在 before_save 中它是不可访问的。 但是 rails 有一些更多的 Active-record 函数,比如field_changed ,可以直接在 before_save 和 after_save 中使用。 所以我最终得到了这个解决方案

#working code
after_save :run_function
def run_function
   @old_value = field_was
   if @old_value==self.field
      create_record_in_history :old_value => @old_value, :new_value => self.field
   end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM