NoMethodError:未定义的方法' ' for main:Object - 每当调度程序

时间:2016-03-15 18:12:06

标签: ruby-on-rails ruby heroku rake whenever

我无法 reminder.rake 在制作中工作。我收到了错误。

namespace :challenges do
  desc 'Send email to users with challenges who want reminder'
  task challenge_reminder: :environment do
    self.all.each do |challenge|
      UserMailer.challenge_reminder(self).deliver_now # Tried (challenge) instead of (self), same error too
    end 
  end
end

heroku调度程序

enter image description here

跟踪错误

Anthony-Gallis-MacBook-Pro:livetochallenge galli01anthony$ heroku run rake challenges:challenge_reminder --trace
Running rake challenges:challenge_reminder --trace on livetochallenge... up, run.7666
rake aborted!
NoMethodError: undefined method `all' for main:Object
/app/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>'
Tasks: TOP => challenges:challenge_reminder
(See full trace by running task with --trace)
Anthony-Gallis-MacBook-Pro:livetochallenge galli01anthony$

作为一个示例我已经完成了以下工作,所以我知道设置 whenever gem 或heroku调度程序不是问题:

namespace :challenges do
  desc 'Clean the challenge freebies and freebie_dates'
  task clean: :environment do
    Challenge.update_all(freebie: 0, freebie_date: nil)
  end
end

2 个答案:

答案 0 :(得分:1)

根据跟踪,看起来文件/app/lib/tasks/clear_deadline.rake的第4行指的是rake,这就是它失败的原因。

查看文件内容,或提供该文件的代码。

答案 1 :(得分:1)

您的Rake任务存在问题:

task challenge_reminder: :environment do
  self.all.each do |challenge|
    UserMailer.challenge_reminder(self).deliver_now
  end 
end

此处self指的是Rake任务上下文,而不是此代码所源自的模型。你还需要对challenge做一些事情,或者检索它没有意义。

建议修复:

task challenge_reminder: :environment do
  Challenge.all.each do |challenge|
    UserMailer.challenge_reminder(challenge).deliver_now
  end
end

请记住,在具有大量记录的模型上调用.all可能会占用大量内存,如果它太大,可能会使服务器崩溃,因为Rails会将每条记录加载到内存中。如果你有数百万的那些,你可能会吐司。

在尝试追溯问题时,请先查看错误中引用的行,然后从那里开始工作。 Ruby的堆栈跟踪通常足以解决问题的根源。