質問

私は簡単なセットアップを持っています UserUserProfile ユーザーとのモデル has_one :user_profile とUserProfile belongs_to :user.

しかし、私はRailsがどのように実行順序を定義するかについて頭を包むことができません after_create コールバックと accepts_nested_attributes_for 私のモデルで定義されています。これらの2つのケースを考えてみましょう。

ケース1:

class User < ActiveRecord::Base
  has_one :user_profile
  accepts_nested_attributes_for :user_profile
  after_create :test_test
end

さて、コンソールを介して(user_profile_attributesハッシュも使用して)ユーザーを作成すると、 after_create コールバックは、ユーザーとそのユーザープロファイルが作成された後にトリガーされます。

ケース2: の場合は、 after_create 上部に配置されています,

class User < ActiveRecord::Base
  after_create :test_test
  has_one :user_profile
  accepts_nested_attributes_for :user_profile
end

コールバックは、ユーザーが作成された後、ユーザープロファイルを作成する前にトリガーされます。

これはそれが機能することが期待される方法ですか?ここでRailsは内部的に何をしていますか?実行シーケンスは単にコードの順序によって決定されますか?

これを深く掘り下げたりデバッグしたりするには、どこから始めますか?

役に立ちましたか?

解決

モデル内の宣言の順序は、コードの実行順序に影響を与える可能性があります。これは様々な奇妙なことの源です。(たとえば、現在のコールバック定義とhas_and_belongs_to_many関連付けは順序に依存します: https://github.com/rails/rails/pull/8674 )

問題をデバッグするには、railsソースを参照する必要があります。あなたの問題は実行順序、コールバック、ネストされた属性に関係しているので、私は読むことから始めます:

これにより、より深く掘り下げるために必要な背景が得られます。あなたはそれに気づくでしょう accepts_nested_attributes_for への呼び出し add_autosave_association_callbacks https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 このメソッドは、 after_create コールバックと私が知る限り、コールバックは定義の順に実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top