2015-03-16 10 views
6

mi chiedo su come si fa a accedere ActiveJob eseguire i parametri nel blocco resue, come ad esempioCome accedere eseguire parametri nel soccorso ActiveJob

def perform object 
end 

rescue_from Exception do |e| 
    if e.class != ActiveRecord::RecordNotFound 
     **job.arguments.first** 
     # do something 
    end 
end 

Thank You !!

+0

Dove si verifica l'eccezione? Nel metodo perform? In tal caso, è sufficiente posizionare il blocco di salvataggio sotto il codice colpevole all'interno del metodo di esecuzione. Avrai accesso al parametro 'object' come variabile locale. – Noz

+0

Noz, ho anche before_enqueue e around_perform e quindi rescue_from. – ConfusedUser

+0

Non ho usato nessuno di questi prima, ma non puoi posizionare il tuo blocco di salvataggio in nessuno di questi blocchi? Non penso che tu voglia usare 'rescue_from' nel tuo ActiveJob, un semplice' salvataggio ActoveRecord :: RecordNotFound => e' dovrebbe essere sufficiente. – Noz

risposta

2

Non avevo idea di quello, quindi ho semplicemente deciso di provare a utilizzare self all'interno del blocco rescue_from e ha funzionato.

rescue_from(StandardError) do |ex| 
    puts ex.inspect 
    puts self.job_id 
    # etc. 
end 

Come nota a margine - Mai e poi mai salvare Exception:

Why is it a bad style to `rescue Exception => e` in Ruby?

6

E 'possibile con arguments all'interno del blocco rescue_from:

rescue_from(StandardError) do |exception| 
    user = arguments[0] 
    post = arguments[1] 
    # ...  
end 

def perform(user, post) 
    # ... 
end 

Questo funziona anche per le richiamate come bene (ad esempio all'interno di after_perform).

+0

Questo non funziona per me in Rails 5.0.0.1. – Vadim

+2

Grazie, ha funzionato per me (Rails 5.0.1, sidekiq 4.2.9). Nel blocco 'rescue_from',' arguments [0] 'mi ha dato il primo argomento passato a' perform'. – DelPiero

+2

Funziona anche per me su Rails 5.0.2 – fguillen

1

È possibile accedere a tutti Bindings per ex.bindings. Per essere sicuri di ottenere il legame corretto per il processo si dovrebbe verificare il ricevitore come questo :

method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) } 

quindi è possibile ottenere tutte le variabili locali con .local_variable_get. Dal momento che il metodo argomenti sono anche le variabili locali, si può almeno fetch esplicitamente:

user = method_binding.local_variable_get(:user) 
post = method_binding.local_variable_get(:post) 

Così, per esempio, voi:

def perform object 
end 

rescue_from Exception do |e| 
    if e.class != ActiveRecord::RecordNotFound 
     method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) } 
     object = method_binding.local_variable_get(:object) 
     # do something 
    end 
end 

1. E 'ancora possibile che questo legame non è quella di perform se chiamate altri metodi di istanza nel metodo di esecuzione del lavoro e l'errore si verifica lì. Questo può anche essere preso in considerazione ma è lasciato fuori per brevità.

Problemi correlati