È 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à.
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
Noz, ho anche before_enqueue e around_perform e quindi rescue_from. – ConfusedUser
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