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'是内部使用的...
我正在传送来自
的邮件消息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'是内部使用的...