2010-12-11 7 views
4

Je travaille pour apprendre comment user delayed_job sur mes rails 3 + heroku app.Rails 3 - Delayed_Job

J'ai actuellement ce qui suit e-mails sur une demande (travail non retardé) mais cela fonctionne!

UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver 

Je mis à jour que ce pour commencer à utiliser delayed_job:

Delayed::Job.enqueue UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver 

Mais ce error'd avec: "ArgumentError (ne peut pas enqueue articles qui ne répondent pas à effectuer):"

J'ai essayé aussi:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments) 

Mais ce error'd avec:

NoMethodError (undefined method `delay' for UserMailer:Class): 

Est-ce qu'un gourou de delayed_job est là? Merci

+1

futurs Googlers d'abord essayer de redémarrer votre serveur – brittohalloran

Répondre

6

De la documentation https://github.com/collectiveidea/delayed_job

Votre deuxième méthode était correcte qui élimine la méthode .deliver:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments) 

Si vous obtenez un non défini méthode delay avez-vous ajouté DelayedJob à la Gemfile?

gem "delayed_job" 

Puisque l'inclusion de delayed_job ajoutera la méthode "delay" à tout.

1

Je viens d'avoir un coup d'œil à la documentation, il a été un moment que j'ai utilisé delayed_job ...

emplois sont Ruby objets avec une méthode appelée perform, de sorte que vous auriez besoin d'un enqueue objet qui ne

UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver 

dans sa méthode perform.

Vous pouvez également utiliser send_later:

UserMailer.conversation_notification(record.commentable, participant, record, @comments).send_later(:deliver) 
+0

Merci, mais cela ne fonctionne pas – AnApprentice

+0

j'ai essayé "UserMailer.conversation_notification (record.commentable, participant, enregistrement, @comments) .delay.deliver" mais se « NoMethodError (méthode non définie 'delay 'pour # ):" – AnApprentice

+0

Je pense que la référence ci-dessus le mauvais docs, pour les rails 3, voir: https://github.com/collectiveidea/delayed_job – AnApprentice

2

J'ai des résultats mitigés avec l'utilisation du délai, et j'ai trouvé très difficile de déboguer. Donc, vous n'êtes pas seul! Mais quand vous le faites fonctionner, ça vaut le coup.

J'ai appris à sauvegarder mon objet avant d'appeler le délai. Généralement, je déclencherai mon travail à partir d'un rappel after_save.

À titre expérimental, j'ai utilisé un motif différent pendant un certain temps. Je créerais un objet de travail pour chaque travail que j'ai. Par exemple, je qualifierais

Delayed::Job.enqueue(PersonJob.new(@person.id)) 

Ailleurs dans mon projet je voudrais créer l'objet de travail. Dans Rails 2, je les mets en lib/si vous le faites avec les rails 3, vous devez modifier la configuration de l'application.rb.autload_path

class PersonJob < Struct.new(:person_id) 
    def perform 
    person = Person.find(person_id) 
    #do work 
    end 
end 


config.autoload_paths += Dir["#{config.root}/lib/**/"]