2015-01-13 18 views
11

Sono terribilmente confuso riguardo a un giro_azione. Come funzionano? Qualcuno può fornirmi un esempio/spiegazione di come funzionano?Come funziona un callback around_action? Una spiegazione è necessaria

Questa è una citazione dal mio Agile Web Development 4 libro:

Intorno callback avvolgere l'esecuzione di azioni. È possibile scrivere un in base alla richiamata in due stili diversi. Nel primo, il callback è un singolo pezzo di codice. Questo codice viene chiamato prima che l'azione venga eseguita. Se il codice di richiamata richiama rendimento, l'azione viene eseguita. Al termine dell'azione, il codice di richiamata continua ad essere eseguito. Pertanto, il codice prima del rendimento è come un callback prima dell'azione e il codice dopo il rendimento è il callback dopo l'azione. Se il codice di richiamata non invoca mai il rendimento. l'azione non viene eseguita, equivale ad avere una prima azione callback return false.

Ho capito quando l'ho letto. Ecco un esempio delle guide di Rails

class ChangesController < ApplicationController 
    around_action :wrap_in_transaction, only: :show 

    private 

    def wrap_in_transaction 
    ActiveRecord::Base.transaction do 
     begin 
     yield 
     ensure 
     raise ActiveRecord::Rollback 
     end 
    end 
    end 
end 

Quindi cosa sta succedendo qui? ActiveRecord :: Base.transaction inizia come la parte "prima" e aumenta ActiveRecord :: Rollback come la parte "dopo"? A cosa sta andando questo metodo? È lo spettacolo? Infine, cosa causerebbe il fallimento del metodo yield causando il fallimento dell'intera callback? Sarebbe il rendering dell'azione spettacolo? Non capisco Aiuto per favore.

risposta

10

La mia comprensione è come qui sotto:

begin 
    # Do before action... 
    logger.info 'I am the before action' 

    # Do the action, which is passed as a block to your "around filter" 
    # Note that if you were to delete this line, the action will never be called! 
    yield 

    # Do after action... 
    logger.info 'I am the after action' 
ensure 
    raise ActiveRecord::Rollback 
end 
10

La chiave del around_callback è yield. Nel caso dell'esempio wrap_in_transaction: la resa viene sostituita con l'azione show. Quando lo spettacolo termina (rendering compreso), wrap_in_transaction continua e fa il rollback.

A rotaie guides si possono trovare:

Per esempio, in un sito web in cui i cambiamenti hanno un workflow di approvazione di un amministratore potrebbe essere in grado di visualizzare in anteprima facilmente, basta applicarli all'interno di una transazione: ... Nota che un filtro attorno avvolge anche il rendering. In particolare, se nel precedente esempio la vista stessa legge dal database tramite un ambito o qualsiasi altra cosa, lo farà all'interno della transazione e quindi presentare i dati in anteprima."

Questo significa che l'utente a show lattina vedere le informazioni prima del rollback (in questo caso show deve eseguire un aggiornamento di ordinamento che richiede un rollback perché è un'azione di informazione)

Si può pensare che un round_callback sia un callback precedente e un callback dopo solo un metodo, usando yield per mettere l'azione nel mezzo.

Problemi correlati