2012-10-26 17 views
6

Ciao, ho un problema particolare. Io uso un callback after_commit per inviare notifiche, ma sembra che il callback non sia attivato. Semplificato la situazione si presenta così:Rails non attiva il mio callback after_commit

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    raise 'Doing something' 
    end 
end 

Poi mi aspettavo di vedere il rilancio quando apro la console e creare un messaggio. Ma non succede nulla. Inoltre le rotaie non si lamentano nemmeno se elimino completamente il metodo 'do_qualcosa'. Si noti che questo non è un test con fixture transazionali. Vedo persino il record commesso nel db. La mia versione di rotaie è 3.0.9. Grazie per l'aiuto, soprattutto se è buono :-)

Modifica: ho appreso in seguito che la richiamata DID viene attivata quando ho distribuito il codice su una macchina diversa. Quindi deve essere qualcosa con il mio setup. Comunque apprezzerei la tua opinione su cosa potrebbe causare questo.

Modifica2: dai commenti.

  • Il DB è MySQL in modo che le transazioni siano presenti.
  • Specificare l'azione del callback non ha aiutato (: on =>: create).
  • Ho bisogno after_commit e nessun altro richiamata
+0

Come si sta creando il modello nella console – felipeclopes

+0

ho provato tramite una fabbrica e anche attraverso un salvataggio e salvare ! call – Renra

+0

Come ho capito tutti dovrebbero attivare il callback. Ho anche provato da una console di produzione. – Renra

risposta

3

David menzionato la spiegazione per questo comportamento nel commento domande.

Transaction Callbacks documentation

"Se tutte le eccezioni sono sollevate all'interno di uno di questi callback, saranno essere ignorato in modo che non interferiscano con gli altri callback. Come tale, se il codice di callback potrebbe aumentare un'eccezione, è necessario eseguire il salvataggio di e gestirlo in modo appropriato all'interno del callback."

vedi anche:?

-2

Hai la seguente:

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    puts 'Doing something' 
    end 
end 

si può provare con after_create o after_save a seconda delle esigenze.

after_commits basta eseguire quando il record viene salvato correttamente nel database, perché salva, salva! e distruggi le esecuzioni all'interno delle transazioni.

Come sono contenute nella documentazione: Active Record Callbacks

+4

Ho specificamente bisogno di after_commit, perché after_create può essere eseguito PRIMA che il record sia effettivamente impegnato nel db in modo che anche le altre connessioni possano leggerlo. E se invii una notifica ad un altro dispositivo con un id del record e il record non è ancora lì -> non succede nulla. – Renra

0

Si dovrebbe specificare l'azione quando questo after_commit deve essere attivata ....

L'after_commit è fondamentalmente utilizzato in quei database in cui è presente il concetto di operazione .. .so provare il seguente codice ...

class Message < ActiveRecord::Base 
after_commit :do_something, :on => [:create, :update, :destroy] 

def do_something 
    raise 'Doing something' 
end 
end 
+0

Anche pensato, ma non è stato d'aiuto. – Renra

+0

Giusto, ho dimenticato di menzionare che il DB è MySQL. – Renra

+0

Penso che non dovrebbe importare molto perché MySQL e Sqlite supportano entrambe le transazioni e se non è in esecuzione su MySQL quindi non eseguirà anche SQLite ... ma comunque puoi provarlo e fammi sapere i risultati. .. –

0

provare se al di sotto di codice consente -

class Message < ActiveRecord::Base 
after_commit :do_something, :only => [:create, :update, :destroy] 

def do_something 
    raise 'Doing something' 
end 
end 
+0

Nno, questo non ha aiutato. Vedi la seconda modifica della domanda. Ma grazie comunque. – Renra

1

Potrebbe essere necessario inserire una patch nella specifica/supporto per abilitare callback after_commit quando si utilizzano fixture transazionali. Se si utilizzano fixture di transazione, un commit non si verifica in realtà.

La patch: https://gist.github.com/charleseff/1305285

+2

The Gist è già pieno e funzionante anche https://github.com/grosser/test_after_commit – dolzenko

Problemi correlati