【问题标题】:ActiveJob issue implementing Delayed_job实施 Delayed_job 的 ActiveJob 问题
【发布时间】:2017-01-28 09:23:22
【问题描述】:

对于我使用 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

你好,

安东尼

【问题讨论】:

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


    【解决方案1】:

    Rails 的 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 方法发送异步电子邮件

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多