【问题标题】:Passing arguments to rake task from model not working将参数传递给模型中的 rake 任务不起作用
【发布时间】:2016-05-25 05:00:01
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails actionmailer rake-task


    【解决方案1】:

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

    但是,这一切都不是必需的,因为您可以直接传递一个数组来调用。

    您的代码也不必要地令人费解。特别是不建议在方法中使用load 文件(因为它会导致在每次调用该方法时评估文件内容)。很容易在顶部是required。

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

    【讨论】:

    • 感谢您的建议。即使我将数组传递给invoke,似乎任务中的代码仍然没有运行。
    • 如果有人读到这篇文章,我放弃了上述解决方案并集成了 sidekiq 以将其作为后台作业而不是 rake 任务运行。
    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2015-02-14
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多