【问题标题】:Rails 6 Active Job. Why I can't send async tasks?Rails 6 活动作业。为什么我不能发送异步任务?
【发布时间】:2021-06-14 04:14:46
【问题描述】:

我正在关注https://guides.rubyonrails.org/action_mailer_basics.html#calling-the-mailer 上的 Action Mailer 指南

我做了几乎相同的教程展示。控制器:

def create
  @user = User.create(user_params)

  if @user && UserMailer.with(user: @user).welcome_email.deliver_later
     token = encode_token({ user_id: @user.id })
     render json: { token: token }, status: :created
  else
     render json: @user.errors.messages, status: :bad_request
  end
end

邮递员:

class UserMailer < ApplicationMailer
  default from: 'notifications@example.com'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: 'Welcome to My Awesome Site')
  end
end

但是当我提出请求时,Active Job 大喊:

ActiveJob::SerializationError => "Unsupported argument type: User"

使用deliver_now可以正常工作

这表明我们的:async 适配器有问题。但正如指南所说:

Active Job 的默认行为是通过 :async 适配器执行作业。因此,您可以使用 Deliver_later 异步发送电子邮件。 Active Job 的默认适配器使用进程内线程池运行作业。它非常适合开发/测试环境,因为它不需要任何外部基础设施,但它不适合生产,因为它会在重启时丢弃待处理的作业。如果您需要持久后端,则需要使用具有持久后端(Sidekiq、Resque 等)的 Active Job 适配器。

那么我在这里缺少什么?

【问题讨论】:

  • 你也可以分享你的方法代码吗?
  • 你说的邮递员?
  • 是的..顺便说一句,如果您可以在代码with(user_id: @user.id) 中传递 id 并在邮件方法中找到用户,如@user = User.find(params[:user_id]),它将起作用。试着告诉我。
  • 它没有用。现在产生的错误是:“不支持的参数类型:BSON::ObjectId”
  • 太好了!坚持下去..

标签: ruby actionmailer ruby-on-rails-6 rails-activejob


【解决方案1】:

它不起作用,因为 ActiveJob 不支持对象。要使其可访问,您必须将其转换为 json 字符串,然后在 mailer 方法中反序列化。

尝试将对象作为 json 字符串发送并检索 id 值,然后使用:

@user = User.find(params[:user_id])

另一种方法是使用 Resque 或 Sidekiq 来处理这些作业。它们真的很方便。

帮助人们的另一个来源:

https://stackoverflow.com/a/40896988/5832250

如果您想使用 rails 指南并了解更多信息:

https://guides.rubyonrails.org/active_job_basics.html#globalid

【讨论】:

  • 谢谢! @João Ramires
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2019-08-23
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多