我正在尝试调用rake任务,从控制器操作向订阅者列表发送电子邮件,如下所示:
控制器操作:
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 :(得分:0)
您正在将一个字符串传递给您的任务,因此除非您从字符串中提取返回的数组,否则您实际上是在字符串而不是项目上进行枚举。我想知道你正在使用什么版本的ruby因为1.9+字符串不再是可枚举的,所以你应该得到一个错误。
但是所有这些都不是必需的,因为您可以直接传递一个数组来调用。
您的代码也不必要地复杂化。特别是不建议在方法中使用load
文件(因为它会导致在每次调用方法时评估文件内容)。它可能很容易require
d位于顶部。
理想情况下,如果将逻辑从rake任务移动到模型中的方法或介体中并且只是从rake任务和邮件程序中调用它,那将会更好。