如何读取控制器在before_save回调中设置的值?
示例:
我有一个url
字段的模型。在保存之前,我想检查网址是否已更改。如果是这样,请使用新旧网址做一些事情。
这可能吗?
答案 0 :(得分:20)
答案 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