我是Rails的新手,我遇到了一个问题: 我必须为Coworking Area构建一个应用程序。自由职业者填写表格,他们可以拥有以下两种状态之一:接受或确认。 我用Enum类型处理这个。 我可以收到他们的邮件:Freelancer.confirm.map {| freelancer | freelancer.email}
在Rails控制台中:
Freelancer Load(2.8ms)SELECT“freelancers”。* FROM“freelancers” 在哪里“自由职业者”。“状态”=? [[“status”,0]] => [“freelancer1@mail.com”,“freelancer2@mail.com”, “freelancer3 @ mail.fr”,“freelancer4@mail.com”,“freelancer5 @ mail.fr”, “freelancer6@mail.com”,“freelancer7@mail.com”, “freelancer8@mail.com”,“freelancer9@mail.com”, “freelancer10@mail.com”,“freelancer11@mail.com”]
但我无法在我的应用中正确使用它:
在我的app / models / freelancer.rb
中class Freelancer < ApplicationRecord
enum status: [:confirm, :accept]
def send_contract_email
UserMailer.contract_email(self).deliver_now
end
end
在app / mailers / user_mailer.rb
中class UserMailer < ApplicationMailer
def contract_email(freelancers)
@emails = freelancers.accept.map{|freelancer| freelancer.email}
mail(to: @emails, subject: 'Welcome to my site')
end
end
在lib / tasks / email_tasks.rake
中desc 'send contract email'
task send_contract_email: :environment do
UserMailer.contract_email(freelancers).deliver_now
end
在config / environments / schedule.rb中(为方便起见,设置为5分钟)
every '5 * * * *' do
rake 'send_contract_email'
end
在app / views / user_mailer / contract_email.html.erb
中<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Hi!</h1>
</body>
</html>
我跑的时候 rake send_contract_email 为了测试一切正常并检查电子邮件是否发送,它会显示错误:
耙子流产了! NameError:未定义的局部变量或方法freelancers' for main:Object /home/gaelle/Bureau/corworking/coworking/lib/tasks/email_tasks.rake:3:in
阻止' /home/gaelle/.rvm/gems/ruby-2.4.1/gems/rake-12.1.0/exe/rake:27:in<top (required)>' /home/gaelle/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in
的eval” /home/gaelle/.rvm/gems/ruby-2.4.1/bin/ruby_executable_hooks:15:in ''任务:TOP =&gt; send_contract_email(通过运行查看完整跟踪 任务--trace)
问题似乎出现在UserMailer中,但我无法理解为什么我错了,因为我在模型中使用Freelancer(带有self)。 谢谢你的帮助!
答案 0 :(得分:1)
您的任务send_contract_email
看起来像是在使用尚未初始化的本地变量freelancers
。在调用freelancers
之前,您需要将UserMailer.contract_email
设置为任务中的自由职业者列表,否则将列表作为参数传递给任务。 Here's a nice post包含有关如何将参数传递给rake任务的信息。