2012-02-20 43 views
20

我遇到一個奇怪的問題,即當父更新兒童回調,不會引發...Rails的嵌套屬性兒童回調,不會引發

我有以下模式設置:

class Budget < ActiveRecord::Base 
    has_many :line_items 
    accepts_nested_attributes_for :line_items 
end 

 

class LineItem < ActiveRecord::Base 
    belongs_to :budget 

    before_save :update_totals 

    private 
    def update_totals 
    self.some_field = value 
    end 
end 

在我的形式,我有嵌套的字段(內置使用fields_for):

= form_for @budget do |f| 
    = f.text_field :name 
    = f.fields_for :line_items do |ff| 
    = ff.text_field :amount 

爲什麼update_totals回調兒童從未解僱/我能做些什麼來使其火災?

+0

你有沒有找到解決方案? – Steve 2012-02-27 02:48:51

+0

不......我最後只是寫了一堆奇怪的回調 – sethvargo 2012-02-28 05:03:18

+0

我構建了一個小的示例應用程序,無法重現您的問題。您確定回調沒有被解僱嗎?最簡單的方法是確保就是在方法內部引發一個異常,如果異常被提出,那麼我們知道回調被觸發了,所以回調代碼中可能存在缺陷,而不是回調本身 – 2012-02-20 20:50:36

回答

30

我有同樣的問題。 before_save模型未更改時不調用回調。

您正在更新line_items,而不是budget,因此rails認爲它沒有更新,因此不會爲其調用save

您需要將before_save更改爲after_validation,因此即使模型沒有更改屬性,也會調用它。在這個回調中,當你改變一些屬性時,Rails會看到你的模型已經改變,並且會調用save

+1

觸摸不起作用,因爲它不會觸發回調...... – Nico 2013-06-14 16:30:06

+0

謝謝,@尼科,刪除來自答案。由於某種原因,我認爲它應該觸發回調 – 2013-06-14 20:08:40

+1

我有after_save有同樣的問題,我應該怎麼辦@Nico – ratnakar 2015-03-28 12:05:42

8

老問題,我知道,但它仍然首先在搜索中出現。我覺得這篇文章有一個解決方案:

Rails, nested attributes and before_save callbacks

如果我的理解是正確的文章,這個問題(如@AntonDieterle解釋了他的答案)是孩子的回調不會被觸發,因爲父ISN '骯髒'。「這個arcticle的解決方案是通過在父屬性上調用attr_name_will_change!來「強制」它是髒的,實際上它不會改變。請參閱Rails API 2中的[Active Model Dirty]。

Anton的使用after_validation代替before_save的解決方案聽起來簡單,但我希望把這個在那裏的一個選擇。

+0

總是有回報的鏈接到您的答案。謝謝。 – tamersalama 2015-09-09 04:26:48

+3

第一個鏈接不再工作 – trushkevich 2016-07-21 12:46:03

+2

WayBackMachine來拯救!試試http://web.archive.org/web/20150613004201/http://tamersalama.com/2011/11/10/rails-nested-attributes-and-before_save-callbacks – 2016-07-22 00:11:35