将参数传递给模型的耙子任务不起作用



我正在尝试调用一个 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

重定向发生,我被带到该页面,没有错误,但是没有发送电子邮件。因此,我不知道为什么这不起作用。

有什么想法吗?

你正在将一个字符串传递给你的任务,所以除非你从字符串中提取 id 数组,否则你实际上是枚举字符串而不是项目。我想知道您使用的是哪个版本的 ruby,因为在 1.9+ 字符串中不再是可枚举的,因此您应该会收到错误。

但是,所有这些都不是必需的,因为您可以直接传递要调用的数组。

您的代码也变得不必要地复杂。特别是不建议从方法中load文件(因为这会导致在每次调用方法时评估文件内容)。它可以很容易地在顶部require d。

理想情况下,如果您将逻辑从 rake 任务移动到模型或中介器中的方法,并且只是从 rake 任务和邮件程序调用它会更好。

相关内容

  • 没有找到相关文章

最新更新