4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ActionMailerのdeliver_laterではシリアライズが必要(な時がある)

Posted at

結論はタイトルの通り

「ActionMailerでメールを送ろうとしたら、エラーがでる」ことがあった。エラーの内容は

ActiveJob::SerializationError (Unsupported argument type: User)

であった。この時、メールは

***_controller.rb
ApplicationMailer.welcome_email(@user).deliver_later

と書いていた。RailsのActionMailerは、ActiveJobと統合しており、リクエストレスポンス通信のバックでメールを非同期に送信する機能がついている。それが、「.deliver_later」である。
ところが、この場合、渡す引数はシリアライズされたもの、つまり、

//edgeapi.rubyonrails.org/より
NilClass, Integer, Fixnum, Float, String, TrueClass, FalseClass, Bignum, BigDecimal, and objects that can be represented as GlobalIDs (ex: Active Record)

を指定する必要がある。一方で、deliver_nowは、ActiveJobを利用しないので、@user配列を引数にとっても問題ない。ということで、特に重たい処理でない場合は、deliver_nowを使っておけば良さそうだ。

そもそも、シリアライズとは、直列化のことで、「ある環境において存在しているオブジェクトを、バイト列やXMLフォーマットに変換することをいう。」(wikipediaより)ということ。以下が具体例も交えてわかりやすく解説してくれている。

以下ドキュメントによれば、ActiveJobに渡されるオブジェクトが、GlobalIDを使っていれば、シリアライズを求めることはないらしい。
https://railsguides.jp/active_job_basics.html

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?