Sie können auf alle Bindings von ex.bindings
zugreifen. Um sicherzustellen, dass Sie die richtige Bindung für Ihren Job bekommen, sollten Sie den Empfänger überprüfen, wie diese :
method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) }
Dann können Sie alle lokalen Variablen mit .local_variable_get
zu bekommen. Da Methodenargumente auch lokale Variablen sind, können Sie zumindest explizit holen:
user = method_binding.local_variable_get(:user)
post = method_binding.local_variable_get(:post)
So Sie zum Beispiel:
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. Es ist immer noch möglich, dass diese Bindung ist nicht derjenige der perform
Wenn Sie andere Instanzmethoden in der Ausführungsmethode Ihres Jobs aufrufen, tritt der Fehler dort auf. Dies kann ebenfalls berücksichtigt werden, wird jedoch der Kürze halber weggelassen.
Wo tritt die Ausnahme auf? In der Perform-Methode? Wenn dies der Fall ist, platzieren Sie einfach Ihren Rettungsblock unterhalb des Täterkodes innerhalb der Perform-Methode. Sie haben Zugriff auf den Parameter 'object' als lokale Variable. – Noz
Noz, ich habe before_enqueue und around_perform also auch die rescue_from. – ConfusedUser
Ich habe keines von beiden zuvor benutzt, aber kannst du deinen Rettungsblock nicht in einen dieser Blöcke legen? Ich glaube nicht, dass Sie "rescue_from" in Ihrem ActiveJob verwenden möchten, ein einfaches 'rettung ActoveRecord :: RecordNotFound => e 'sollte ausreichen. – Noz