Domanda

Ho un semplice set up di User e UserProfile modello con Utente has_one :user_profile e UserProfile belongs_to :user.

Ma io sono in grado di avvolgere la mia testa intorno come Rails definisce l'ordine di esecuzione di after_create richiamata e accepts_nested_attributes_for definite nel modello.Consente di prendere in considerazione questi due casi.

Caso 1:

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

Ora, se posso creare un utente(con user_profile_attributes hash troppo) tramite la console, il after_create callback viene generato dopo che l'utente e il suo profilo utente viene creato.

Caso 2: Se il after_create è posto in alto,

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

la callback viene attivato dopo che un utente è stato creato, ma prima di creare un profilo utente.

È questo il modo in cui dovrebbe funzionare.Cosa Rotaie internamente qui?È la sequenza di esecuzione semplicemente determinato dall'ordine di codice?

Dove posso iniziare a scavare più in profondità o eseguire il debug ?

È stato utile?

Soluzione

L'ordine delle dichiarazioni del modello, che può avere un impatto sul l'ordine di esecuzione del codice.Questa è una fonte di varie cose strane.(per esempio, attualmente richiamata definizioni e has_and_belongs_to_many associazioni sono dipendente: https://github.com/rails/rails/pull/8674 )

Per eseguire il debug del problema è necessario sfogliare le guide di origine.Dato che il tuo problema ha a che fare con l'ordine di esecuzione, di callback e attributi annidati mi piacerebbe iniziare a leggere su:

Questo ti dà il background necessario per scavare più a fondo.Si noterà che accepts_nested_attributes_for chiamate in add_autosave_association_callbacks https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 Questo metodo aggiunge un after_create richiamata e per quanto ne so callback vengono eseguiti in ordine di definizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top