实现Delayed_job的ActiveJob问题

时间:2017-01-28 09:23:22

标签: ruby-on-rails-5 delayed-job rails-activejob

对于我使用Rails 5构建的个人网站,我试图实现发送联系表单的工作。我正在使用delayed_job_active_record gem。

我生成了一份工作ContactMessageJob:

app/jobs/contact_message_job.rb

class ContactMessageJob < ApplicationJob
  queue_as :contact_message

  def perform(message)
    MessageMailer.send_message(message).deliver_now
  end
end

然后在MessagesController中我在ContactMessageJob上调用perform_later方法:

app/controllers/messages_controller.rb

...
def create
  @message = Message.new(message_params)

  if @message.valid?
    ContactMessageJob.perform_later(@message)
    redirect_to contact_path, notice: "Your message has been sent."
  else
    flash[:alert] = "An error occured while delivering this message."
    render :new
  end
end

但是当我尝试通过联系表单发送消息时,我在执行ContactMessageJob.perform_later(@message)时遇到此错误:

ActiveJob::SerializationError at /contact
Unsupported argument type: Message

我使用ActiveJob有点新鲜,所以我不确定如何解决这个问题。任何建议都非常受欢迎。

我的回购邮件是:https://github.com/acandael/personalsite/tree/job

问候,

安东尼

1 个答案:

答案 0 :(得分:0)

滑轨&#39; ActiveJob使用GlobalID进行序列化,GlobalID知道如何序列化原始值(字符串,数字)和ActiveRecord对象。您的Message类是GID无法序列化的基本模型。

您可能更容易选择直接传递message_params作业并从作业中使用它们

MessageMailer.send_message(message_params[:name], message_params[:email], message_params[:content]).deliver_later

*)您不需要contact_message_job.rb上的工作类,因为您可以使用deliver_later方法发送异步电子邮件