2012-02-20 7 views
20

を解雇されていない属性:Railsは、私は次のモデルを設定している</p> <p>...子供のコールバックは、私は親が更新されたときに子供たちのコールバックが発射されていない奇妙な問題に実行している

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を使用して構築された)があります。

なぜ、子供のコールバックは解雇されなかったのですか/それを発動するにはどうすればよいですか?

+0

解決方法を見つけましたか? – Steve

+0

いいえ... :(。私は奇妙なコールバックをたくさん書いてしまいました – sethvargo

+0

私は小さなサンプルアプリケーションを構築して問題を再現できませんでした。コールバックが起動していないことは確かですか?メソッド内で例外を発生させることです。例外が発生している場合は、コールバックが起動されていることがわかっているため、コールバックのコードに瑕疵があり、コールバック自体に瑕疵がある可能性があります。 –

答えて

30

私は同じ問題がありました。 before_saveモデルが変更されていない場合、コールバックは呼び出されません。

budgetではなくline_itemsを更新しています。そのため、railsは更新されていないと判断し、saveを呼び出しません。

before_saveafter_validationに変更する必要があります。モデルに変更された属性がなくても呼び出されるようにします。このコールバックでいくつかの属性を変更すると、モデルに変更があり、saveが呼び出されます。

+1

タッチが機能せず、コールバックを起動しません... – Nico

+0

ありがとう、@Nico、removedそれは答えからのものです。何らかの理由で私はコールバックを引き起こすべきだと思った –

+1

私はafter_saveと同じ問題を抱えています。どうすればいいですか? – ratnakar

8

古い質問、私は知っていますが、それでも検索では最初に表示されます。私はこの記事が解決策を持っていると思う:

Rails, nested attributes and before_save callbacks

私が正しくその記事を理解していた場合、問題は(@AntonDieterleが彼の答えで説明しているように)子コールバックは、親ISNためにトリガされていないということです「汚い」。このarcticleの解決策は、実際には変更されない親属性のattr_name_will_change!を呼び出すことによって、それをダーティにすることです。 Rails API 2の[Active Model Dirty]を参照してください。

before_saveの代わりにafter_validationを使用したAntonのソリューションは、より簡単に聞こえますが、これを別の方法に置きたいと思っていました。

+0

あなたの答えへのリンクを表示するにはいつも報いてください。ありがとう。 – tamersalama

+3

最初のリンクはもう動作しません – trushkevich

+2

WayBackMachine to the rescue! http://web.archive.org/web/20150613004201/http://tamersalama.com/2011/11/10/rails-nested-attributes-and-before_save-callbacks –

関連する問題