2010-12-11 14 views
4

Ich arbeite, um zu lernen, wie man delayed_job auf meiner Rails 3 + Heroku App benutzt.Rails 3 - Delayed_Job

Ich habe derzeit folgende E-Mails auf Anfrage (nicht verzögerter Job), aber es funktioniert!

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

ich diese aktualisiert, dass delayed_job verwenden zu beginnen:

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

Aber das error'd mit: "Argument (kann nicht Produkte einreihen, die reagieren nicht auszuführen):"

ich habe auch versucht:

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

Aber das error'd mit:

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

Irgendein spaced_job-Guru ist da draußen? Dank

+1

Zukunft Googler zuerst versuchen, Ihren Server – brittohalloran

Antwort

6

Aus der Dokumentation https://github.com/collectiveidea/delayed_job

Ihre zweite Methode richtig war, die die .deliver Methode entfernt:

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

Wenn Sie eine undefinierte bekommen Methode delay hast du DelayedJob zum Gemfile hinzugefügt?

Da einschließlich der delayed_job wird die "Verzögerung" -Methode zu allem hinzufügen.

1

Ich hatte gerade einen Blick in die Dokumentation, es ist schon eine Weile her, seit ich delayed_job tatsächlich verwendet ...

Jobs sind Ruby-Objekte mit einer Methode perform genannt, so dass Sie enqueue ein Objekt benötigen würde, die tut

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

in seiner perform Methode.

Alternativ können Sie send_later verwenden:

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

Dank dem Neustart aber nicht – AnApprentice

+0

funktionierte Ich habe versucht, "UserMailer.conversation_notification (record.commentable, Teilnehmer, Rekord, @comments) .delay.deliver", sondern bekommen „NoMethodError (undefinierte Methode 'Verzögerung 'für # ):" – AnApprentice

+0

Ich denke, die oben genannten Verweis die falschen Dokumente, für Schienen 3, siehe: https://github.com/collectiveidea/delayed_job – AnApprentice

2

Ich habe Ergebnisse mit Verzögerung gemischt, und ich habe es sehr schwierig zu debuggen gefunden. Du bist also nicht alleine! Aber wenn es funktioniert, ist es das wert.

Ich habe gelernt, mein Objekt vor dem Aufruf Verzögerung zu speichern. Normalerweise triggere ich meinen Job von einem After_Save Callback.

Als Experiment verwendete ich für eine Weile ein anderes Muster. Ich würde ein Job-Objekt für jeden Job erstellen, den ich habe. Zum Beispiel würde ich anrufen

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

Anderswo in meinem Projekt würde ich das Jobobjekt erstellen. In Rails 2 stelle ich diese in lib/wenn du das mit Rails 3 machst, musst du die application.rb Config ändern.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/**/"]