我已经为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
任何人都知道发生了什么?我在这里想念的是什么?
答案 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']
由于它是一个调度程序任务,您可能不希望为每个任务传递变量,而是希望执行一些数据库查询以查找相关用户。但这只是为了证明错误的解决方法。