2016-05-24 2 views
0

Я пытаюсь вызвать задачу грабель, чтобы отправить по электронной почте список абонентов от действия контроллера так: действиеаргументов Попутных разгребать задачи из модели не работает

Контроллера:

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 

А вот 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 

Переадресация происходит, и я попал на эту страницу без ошибок, однако никакие электронные письма не отправляются. Таким образом, я понятия не имею, почему это не работает.

Любые идеи?

ответ

0

Вы передаете строку в свою задачу, поэтому, если вы не извлечете массив идентификаторов из строки, вы по существу перечислите строку, а не элементы. Я хотел бы знать, какую версию рубина вы используете, потому что в строке 1.9+ больше нет перечислимого типа, поэтому вы должны получить ошибку.

Однако все это не обязательно, потому что вы можете напрямую передать массив для вызова.

Ваш код также излишне запутан. Особенно не рекомендуется load файл из метода (так как это приведет к тому, что содержимое файла будет оцениваться при каждом вызове метода). Это может легко быть require d наверху.

В идеале было бы лучше, если вы переместите логику из задачи грабли в метод модели или посредника и просто вызовите это как из задачи грабли, так и из почтовой программы.

+0

Благодарим вас за консультацию. Даже когда я передаю массив в вызове, кажется, что код в задаче все еще не запущен. – MarkD

+0

Если кто-нибудь читает это, я отказался от вышеуказанного решения и интегрировал sidekiq, чтобы запустить это как фоновое задание вместо задачи грабли. – MarkD

Смежные вопросы