6

Ich frage mich, wie greifen Sie ActiveJob ausführen Parameter im resue Block, wiewie der Zugriff auf Parameter in ActiveJob Rettung durchführen

def perform object 
end 

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

Danke !!

+0

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

+0

Noz, ich habe before_enqueue und around_perform also auch die rescue_from. – ConfusedUser

+0

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

Antwort

6

Es ist möglich, mit arguments innerhalb des rescue_from Block:

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

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

Diese für Rückrufe arbeitet auch als gut (zB innerhalb after_perform).

+0

Das funktioniert bei mir in Rails 5.0.0.1 nicht. – Vadim

+2

Danke, das hat bei mir funktioniert (Rails 5.0.1, sidekiq 4.2.9). Im Block 'rescue_from' gab 'arguments [0]' mir das erste Argument, das an' perform 'übergeben wurde. – DelPiero

+2

Es funktioniert auch für mich auf Rails 5.0.2 – fguillen

1

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.