问题描述
我正在关注 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 适配器执行作业。因此,您可以使用 delivery_later 异步发送电子邮件。 Active Job 的默认适配器使用进程内线程池运行作业。它非常适合开发/测试环境,因为它不需要任何外部基础设施,但它不适合生产,因为它会在重启时丢弃待处理的作业。如果您需要持久后端,则需要使用具有持久后端(Sidekiq、Resque 等)的 Active Job 适配器。
那么我在这里缺少什么?
解决方法
它不起作用,因为 ActiveJob 不支持这些对象。要使其可访问,您必须将其转换为 json 字符串,然后在邮件程序方法中反序列化。
尝试将对象作为 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