2016-05-24 18 views
0

Ich versuche, eine Harke Aufgabe zu nennen, wie so eine E-Mail an eine Liste von Teilnehmern aus einer Controller-Aktion zu senden:Passing Argumente Aufgabe von Modell rechen nicht funktioniert

Controller-Aktion:

def send_digest 
    @article_ids = params[:article_ids] 
    @subject = params[:subject] 
    EmailDigest.send_email_digest("weekly_digest_task", @article_ids, @subject) 

    redirect_to new_digests_path 
end 

email_digest.rb:

require 'rake' 

class EmailDigest < ActiveRecord::Base 

    def self.send_email_digest(weekly_digest_task, article_ids, subject) 
    load File.join(Rails.root, 'lib', 'tasks', 'send_email_digest.rake') 
    Rake::Task['weekly_digest_task'].invoke("\\\"#{article_ids}\\\"","\\\"#{subject}\\\"") 
    end 

end 

Und hier ist die send_email_digest.rake:

task :weekly_digest_task, [:article_ids,:subject] => :environment do |task, args| 

    articles = args.article_ids 
    subject = args.subject 
    article_objects = [] 

    articles.each do |m| 
    article_objects << Article.find_by_id(m) 
    end 

    EmailDigest.all.each do |subscriber| 
    DigestMailer.weekly_digest(subscriber, article_objects, subject).deliver 
    end 

end 

Die Weiterleitung erfolgt und ich werde ohne Fehler zu dieser Seite weitergeleitet, es werden jedoch keine E-Mails gesendet. Daher habe ich keine Ahnung, warum das nicht funktioniert.

Irgendwelche Ideen?

Antwort

0

Sie übergeben eine Zeichenfolge an Ihre Aufgabe. Wenn Sie also das Array von IDs nicht aus der Zeichenfolge extrahieren, werden Sie im Wesentlichen über die Zeichenfolge und nicht über die Elemente aufzählen. Ich würde gerne wissen, welche Version von Ruby Sie verwenden, denn in 1.9+ String ist nicht mehr ein Aufzählungszeichen und so sollten Sie einen Fehler erhalten.

Dies ist jedoch nicht notwendig, da Sie ein Array zum Aufruf übergeben können.

Ihr Code ist auch unnötig verschachtelt. Insbesondere ist es nicht ratsam, die Datei load aus einer Methode heraus zu laden (da dies dazu führt, dass der Dateiinhalt bei jedem Aufruf der Methode ausgewertet wird). Es könnte leicht require d an der Spitze sein.

Idealerweise wäre es besser, wenn Sie die Logik vom Rake-Task in eine Methode im Modell oder Mediator verschieben und diese sowohl von der Rake-Task als auch vom Mailer aufrufen.

+0

Vielen Dank für den Hinweis. Selbst wenn ich ein Array an den Aufruf übergebe, scheint der Code in der Aufgabe immer noch nicht ausgeführt zu werden. – MarkD

+0

Wenn jemand dies liest, habe ich die obige Lösung aufgegeben und sidekiq integriert, um dies als Hintergrundjob anstelle einer Rake-Aufgabe auszuführen. – MarkD