【问题标题】:Send email to user with whenever gem?无论何时使用 gem 向用户发送电子邮件?
【发布时间】:2016-03-13 22:58:41
【问题描述】:

用户has_many 挑战。我想为每个挑战发送电子邮件提醒。

我如何告诉UserMailer 在使用@challenge.send_email 选择的每一天使用无论何时 gem 发送到@user.email

数据库

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 run rake 'challenge: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 run rake 挑战: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

捆绑 exec rake 挑战: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)

【问题讨论】:

    标签: ruby-on-rails ruby email actionmailer whenever


    【解决方案1】:

    2016/03/16 更新

    修复@NoMethodError:未定义方法rake' for main:Object问题

    请将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)。

    【讨论】:

    • 你到底有什么问题?你能给我一些生产日志吗?
    • 请再给我一次日志,reminder.rake 在哪里,在 lib/tasks 中,对吧?
    • 你运行heroku run rake 'challenges:check_challenge_reminder' 了吗?请运行该命令并给我一些日志:)
    • 请再次运行heroku run rake challenges:challenge_reminder --trace(不带'')并给我你的结果。
    • 我想我知道你的问题,你能把self推到self.all.each do |challenge|吗?我觉得你应该把self.all.each do |challenge|改成Challenge.all.each do |challenge|,注意Challenge.all,当你有很多记录时会占用太多内存,试试find_each而不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2020-01-15
    • 2011-01-02
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多