何时向用户发送电子邮件 gem?
Send email to user with whenever gem?
一位用户has_many
挑战。我想为每个挑战发送电子邮件提醒。
如何使用 whenever gem 告诉 UserMailer
在使用 @challenge.send_email
选择的每一天发送到 @user.email
?
db
create_table "challenges", force: true do |t|
t.string "action"
t.text "send_email", default: "---\n- sun\n"
end
create_table "users", force: true do |t|
t.string "name"
t.string "email"
end
user_mailer.rb (action mailer)
class UserMailer < ApplicationMailer
def challenge_reminder(challenge)
@challenge = challenge
@user_id = @challenge.user_id
@email = User.find(@user_id).email
mail to: @email, subject: "It's time to update your #{@challenge.action} Challenge!"
end
end
reminder.rake (whenever gem)
namespace :challenges do
desc 'Send email to users with challenges who want reminder'
task check_challenge_reminder: :environment do
puts "Sending challenge reminders..."
Challenge.challenge_reminder
puts "done."
end
end
challenge.rb
serialize :send_email, Array
#send email (whenever)
def self.challenge_reminder
self.all.each do |challenge|
if challenge.send_email[Date.current.wday] == Date::ABBR_DAYNAMES[Date.current.wday].downcase # this line is correct where sun = sun in the example I just tested, but no email was sent at the appointed hour.
UserMailer.challenge_reminder(self).deliver_now
end
end
end
我想我写的 reminder.rake 错了,或者这行 self.all.each do |challenge|
不正确?
更新
heroku 运行 耙子 'challenges:challenge_reminder'
heroku run rake 'challenges:challenge_reminder'
Running rake challenges:challenge_reminder on livetochallenge... up, run.6997
rake aborted!
NoMethodError: undefined method `rake' 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)
heroku 运行 rake challenges:challenge_reminder --trace
Running rake challenges:challenge_reminder --trace on livetochallenge... up, run.7335
** Invoke challenges:challenge_reminder (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute challenges:challenge_reminder
rake aborted!
NoMethodError: undefined method `rake' for main:Object
/app/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:248:in `call'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:248:in `block in execute'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:243:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:243:in `execute'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:180:in `invoke_with_call_chain'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:173:in `invoke'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:150:in `invoke_task'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `block in top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:115:in `run_with_threads'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:100:in `top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:78:in `block in run'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:176:in `standard_exception_handling'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:75:in `run'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/bin/rake:33:in `<top (required)>'
/app/vendor/bundle/ruby/2.0.0/bin/rake:23:in `load'
/app/vendor/bundle/ruby/2.0.0/bin/rake:23:in `<main>'
Tasks: TOP => challenges:challenge_reminder
捆绑执行耙 challenges:challenge_reminder
rake aborted!
NoMethodError: undefined method `rake' for main:Object
/Users/galli01anthony/Desktop/LiveToChallenge/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>'
/Users/galli01anthony/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `eval'
/Users/galli01anthony/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => challenges:challenge_reminder
(See full trace by running task with --trace)
2016 年 3 月更新
Fix @NoMethodError: undefined method rake' for main:Object
issue
请将self.all.each do |challenge|
改成Challenge.all.each do |challenge|
,注意Challenge.all
,记录多时会占用太多内存,试试find_each
代替。
我认为self.challenge_reminder
中的条件应该是:
challenge.send_email.include? Date::ABBR_DAYNAMES[Date.current.wday].downcase
更新:
根据 reminder.rake
文件,您使用的 rake 命令似乎是错误的,它将是:
rake challenges:check_challenge_reminder
对于 Heroku 服务器,我们不能使用 config/schedule.rb
。 Heroku 为这些类型的任务提供了一个调度程序 (Heroku Scheduler)。
一位用户has_many
挑战。我想为每个挑战发送电子邮件提醒。
如何使用 whenever gem 告诉 UserMailer
在使用 @challenge.send_email
选择的每一天发送到 @user.email
?
db
create_table "challenges", force: true do |t|
t.string "action"
t.text "send_email", default: "---\n- sun\n"
end
create_table "users", force: true do |t|
t.string "name"
t.string "email"
end
user_mailer.rb (action mailer)
class UserMailer < ApplicationMailer
def challenge_reminder(challenge)
@challenge = challenge
@user_id = @challenge.user_id
@email = User.find(@user_id).email
mail to: @email, subject: "It's time to update your #{@challenge.action} Challenge!"
end
end
reminder.rake (whenever gem)
namespace :challenges do
desc 'Send email to users with challenges who want reminder'
task check_challenge_reminder: :environment do
puts "Sending challenge reminders..."
Challenge.challenge_reminder
puts "done."
end
end
challenge.rb
serialize :send_email, Array
#send email (whenever)
def self.challenge_reminder
self.all.each do |challenge|
if challenge.send_email[Date.current.wday] == Date::ABBR_DAYNAMES[Date.current.wday].downcase # this line is correct where sun = sun in the example I just tested, but no email was sent at the appointed hour.
UserMailer.challenge_reminder(self).deliver_now
end
end
end
我想我写的 reminder.rake 错了,或者这行 self.all.each do |challenge|
不正确?
更新
heroku 运行 耙子 'challenges:challenge_reminder'
heroku run rake 'challenges:challenge_reminder'
Running rake challenges:challenge_reminder on livetochallenge... up, run.6997
rake aborted!
NoMethodError: undefined method `rake' 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)
heroku 运行 rake challenges:challenge_reminder --trace
Running rake challenges:challenge_reminder --trace on livetochallenge... up, run.7335
** Invoke challenges:challenge_reminder (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute challenges:challenge_reminder
rake aborted!
NoMethodError: undefined method `rake' for main:Object
/app/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:248:in `call'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:248:in `block in execute'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:243:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:243:in `execute'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:180:in `invoke_with_call_chain'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/task.rb:173:in `invoke'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:150:in `invoke_task'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:106:in `block in top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:115:in `run_with_threads'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:100:in `top_level'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:78:in `block in run'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:176:in `standard_exception_handling'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/lib/rake/application.rb:75:in `run'
/app/vendor/bundle/ruby/2.0.0/gems/rake-11.1.0/bin/rake:33:in `<top (required)>'
/app/vendor/bundle/ruby/2.0.0/bin/rake:23:in `load'
/app/vendor/bundle/ruby/2.0.0/bin/rake:23:in `<main>'
Tasks: TOP => challenges:challenge_reminder
捆绑执行耙 challenges:challenge_reminder
rake aborted!
NoMethodError: undefined method `rake' for main:Object
/Users/galli01anthony/Desktop/LiveToChallenge/lib/tasks/reminder.rake:4:in `block (2 levels) in <top (required)>'
/Users/galli01anthony/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `eval'
/Users/galli01anthony/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => challenges:challenge_reminder
(See full trace by running task with --trace)
2016 年 3 月更新
Fix @NoMethodError: undefined method
rake' for main:Object
issue
请将self.all.each do |challenge|
改成Challenge.all.each do |challenge|
,注意Challenge.all
,记录多时会占用太多内存,试试find_each
代替。
我认为self.challenge_reminder
中的条件应该是:
challenge.send_email.include? Date::ABBR_DAYNAMES[Date.current.wday].downcase
更新:
根据 reminder.rake
文件,您使用的 rake 命令似乎是错误的,它将是:
rake challenges:check_challenge_reminder
对于 Heroku 服务器,我们不能使用 config/schedule.rb
。 Heroku 为这些类型的任务提供了一个调度程序 (Heroku Scheduler)。