Ruby on Rails - 未定义的局部变量或rake任务中的方法

时间:2018-06-01 17:27:36

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

我已经为Mailer创建了一个Rake任务,以便随后安排使用Crontab,并使用Gem Whenever自动执行向用户发送电子邮件。有一段时间只是一个测试,以了解任务是否正常工作。

My Rake Task和Mailer如下。

require 'rake'

desc 'send digest email'
task send_warn_course: :environment do
  MailCourseWarnMailer.course_available(user).deliver!
end

# And my Mailer is:
class MailCourseWarnMailer < ActionMailer::Base

  def course_available(user)
    @user = user
    mail(to: @user.email, subject: "Curso disponível")
  end

end

我将参数传递给任务但这不起作用。当我运行rake send_warn_course时,我收到错误:

rake send_warn_course
rake aborted!
NameError: undefined local variable or method `user' for main:Object

任何人都知道发生了什么?我在这里想念的是什么?

1 个答案:

答案 0 :(得分:2)

由于错误表明您没有定义User

您需要输入用户的电子邮件ID或ID,并需要从数据库中找到该用户,然后将其传递给该功能。

如下所示:

require 'rake'

desc 'send digest email'
task :send_warn_course, [:user_email] => :environment do |t, args|
  user = User.find_by_email args[:user_email]
  MailCourseWarnMailer.course_available(user).deliver!
end

# And my Mailer is:
class MailCourseWarnMailer < ActionMailer::Base

  def course_available(user)
    @user = user
    mail(to: @user.email, subject: "Curso disponível")
  end

end

然后,您可以执行以下任务:

rake send_warn_course['user@email.com']

由于它是一个调度程序任务,您可能不希望为每个任务传递变量,而是希望执行一些数据库查询以查找相关用户。但这只是为了证明错误的解决方法。