【问题标题】:NoMethodError: undefined method ' ' for main:Object - whenever schedulerNoMethodError: main:Object 的未定义方法“” - 每当调度程序
【发布时间】:2023-03-30 23:57:01
【问题描述】:

我无法让 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 调度程序

跟踪错误

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

【问题讨论】:

  • 您在此处粘贴的行是哪一行?
  • 那不是来源。该文件的第 4 行是什么?那是最后的sn-p吗?
  • 您还没有弄清楚该文件的第 4 行包含什么。那里不应该出现对rake 的引用。
  • 这很奇怪,我猜它们之间的联系是多么的紧密。一个文件中的一个错误会影响另一个文件吗?我将删除该文件并更新问题@tadman
  • 是的,当您移动代码时,上下文/范围会发生变化。所以你必须把self.all.each do |challenge|改成Challenge.all.each do |challenge|

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


【解决方案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 的堆栈跟踪通常足够具体,可以找到问题的根源。

【讨论】:

  • 取决于 Rails 版本,如果您不关心默认批量大小 1000 来处理您正在谈论的那些大型数据集,建议使用 in_batchesfind_in_batchesfind_each值得一试。
【解决方案2】:

根据跟踪,文件/app/lib/tasks/clear_deadline.rake 的第4 行似乎引用rake,这就是它失败的原因。

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

【讨论】:

  • 感谢您缩小问题范围。我更新了问题以找到该文件问题的根源。但我给你很多感谢:]
猜你喜欢
  • 2015-01-23
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多