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

时间:2011-12-17 18:49:00

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

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

示例:

我有一个url字段的模型。在保存之前,我想检查网址是否已更改。如果是这样,请使用新旧网址做一些事情。

这可能吗?

4 个答案:

答案 0 :(得分:20)

尝试这样的事情:

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

另见ActiveModel::Dirty

上的文档

答案 1 :(得分:1)

  • 更好的方式

before :todo, if: :first_name_or_last_name_changed?

  • 和您的todo方法
  

def first_name_or_last_name_changed?
   first_name_changed? || last_name_changed?
  

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我尝试了这件事,但没有成功

#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