Rails 4.2 ActionMailer: 没有将 Message 隐式转换为 Hash

Rails 4.2 ActionMailer: no implicit conversion of Message into Hash

我正在传送来自

的邮件消息
class DelayMessageJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
    message = self.arguments.first
    MessageMailer.default(message).deliver_now!
    message[:sent] = true
    message.save
  end

end

它 运行 很好,直到那里......预定然后排队

我的 MessageMailer class 很简单

class MessageMailer < ApplicationMailer
  def default(message)
    @content = message.text
    mail(
      to: "#{message[:recipient_email]}",
      subject: "Hi and welcome"
      )
  end
end

它是父 ApplicationMailer

class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout 'mailer'
end

调试 MessageMailer class,我可以得到消息 arg ..

#<Message id: 19, recipient_email: "yves@icloud.com", text: "retesting", 
delay_until_time: "2015-07-29 15:14:00", timezone_offset: 2, 
sent: false, created_at: "2015-07-29 15:13:48", 
updated_at: "2015-07-29 15:13:48"

邮件正在增加:TypeError: no implicit conversion of Message into Hash

更新 1

我把message[:sent]改成了message.sent,同样的错误

8:06:17 sidekiq.1  | 2015-07-30T06:06:17.365Z 4871 TID-oxt3zobs8
                       WARN: {
                         "class"=>"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper", 
                         "wrapped"=>"DelayMessageJob",
                         "queue"=>"default", "args"=> [{
                           "job_class"=>"DelayMessageJob",
                           "job_id"=>"9f1b52c0-bb4a-479c-bb5c-5ca11ae257b0",
                           "queue_name"=>"default",
                           "arguments"=>[{"_aj_globalid"=>"gid://delay-message-on-rails/Message/23"}]
                         }],
                         "retry"=>true,
                         "jid"=>"8cbffb19c9d88c48e9b9aa00",
                         "created_at"=>1438236297.952947,
                         "enqueued_at"=>1438236377.2572238,
                         "error_message"=>"no implicit conversion of Message into Hash",
                         "error_class"=>"TypeError",
                         "failed_at"=>1438236377.3641548, "retry_count"=>0
                       }
08:06:17 sidekiq.1 | 2015-07-30T06:06:17.365Z 4871 TID-oxt3zobs8
                       WARN: TypeError: no implicit conversion of Message into Hash

错误似乎是在消息排队时引发的...

因为我想在后台发送电子邮件,使用 sidekiq,我不应该忘记在我的 Procfile'mailers' 队列中启动 sidekiq

sidekiq:     sidekiq -q devise,1 -q default -q mailers

我可以直接使用 ActionMailer 或使用 ActiveJob 发送延迟通知

1- 使用 ActionMailer

controllers/messages_controler.rb

 MessageMailer.keep_inform(@message).deliver_later(wait_until: @message[:delay_until_time])

mailers/message_mailer.rb

class MessageMailer < ApplicationMailer
  def keep_inform(notification)
    @content = notification.text
    mail(
      to: "#{notification.recipient_email}",
      subject: "Hi and welcome"
      )
  end
end

2- 使用 ActiveJobs

controllers/messages_controler.rb

DelayMessageJob.set(wait_until: @message[:delay_until_time]).perform_later(@message)

jobs/delay_message_jobs.rb

class DelayMessageJob < ActiveJob::Base
  queue_as :default
  def perform(notification)
    MessageMailer.keep_inform(notification).deliver_now
    notification.sent = true
    notification.save
  end
end

两种情况: 我定义了我的 mailers/messages_mailer.rb

class MessageMailer < ApplicationMailer  
  def keep_inform(notification)
    @content = notification.text
    mail(
      to: "#{notification.recipient_email}",
      subject: "Hi and welcome"
      )
  end
end

注意: 我不知道它是否重要,但我将术语'message'更改为'notification',我猜'message'是内部使用的...