12
votes

Comment accéder aux paramètres d'exécution dans la sauvetage Activejob

Je me demande comment accédez-vous à ActiveJob Effectuer des paramètres dans le bloc de réutilisation, tels que

def perform object
end

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


4 commentaires

Où est l'exception survenue? Dans la méthode d'exécution? Si tel est le cas, placez simplement votre bloc de sauvetage sous le code de coupable dans la méthode d'exécution. Vous aurez accès au paramètre objet en tant que variable locale.


Noz, j'ai avant_enqueue et autour_performez aussi bien que le sauvetage_from.


Je n'ai utilisé ni de ceux-ci auparavant, mais pouvez-vous ne pas placer votre bloc de sauvetage dans l'un ou l'autre de ces blocs? Je ne pense pas que vous souhaitiez utiliser sauve_from dans votre activejob, un simple Rescue Actoverecord :: RecordNotFound => E devrait suffire.


Il est définitivement pris en charge (et utile) à utiliser sauve_from dans Activejobs: EDGEGUIDES .RubyonRails.org / actif_job_basics.html # Exceptions Spécifiquement, il est très utile dans une classe de base d'emploi (où des échecs similaires peuvent être consolidés à un sauve_from plutôt que copié dans une douzaine Effectuez blocs).


3 Réponses :


2
votes

Je n'avais aucune idée de cela aussi, alors décidé simplement d'essayer d'utiliser auto code> à l'intérieur du bloc de sauve_from code> de et fonctionnait.

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


1 commentaires

Rescue_From () ne fonctionne que avec des exceptions à partir de StandardError Down: GITUB.com/Rails/Rails / Problèmes / 28874 # Issuecomment-297599254



17
votes

Il est possible avec arguments à l'intérieur du Rescue_from Bloc: xxx

Ceci fonctionne également pour les rappels (par exemple, à l'intérieur after_perform ).


1 commentaires

Merci, cela a travaillé pour moi (Rails 5.0.1, Sidekiq 4.2.9). Dans le sauve_from bloc, argument [0] m'a donné le premier argument qui a été transmis à exécuter .



1
votes

Vous pouvez accéder à tous liaisons par ex.bindings . Pour vous assurer que vous obtenez la liaison correcte pour votre travail, vous devez vérifier le récepteur comme celui-ci 1 : xxx

alors vous pouvez obtenir toutes les variables locales avec . local_variable_get . Étant donné que les arguments de la méthode sont également des variables locales, vous pouvez au moins explicitement les chercher: xxx

donc pour vous exemple: xxx

1. Il est toujours possible que cette liaison ne soit pas celle de Effectuer si vous appelez d'autres méthodes d'instance dans la méthode de votre travail et que l'erreur se produit. Cela peut également être pris en compte mais est laissé de côté pour la brièveté.


0 commentaires