簡體   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