web-dev-qa-db-ja.com

アクションジョブ/メーラーの `deliver_now`と` deliver_later`の違い

Rails)のActionJobとのインターフェースの一般的なパターンは、perform_nowまたはperform_laterを介して非同期に呼び出されるperform()メソッドを使用してジョブを設定することです

メーラーの特殊なケースでは、ActionJobActionMailerと統合されているため、deliver_nowまたはdeliver_laterを直接呼び出すことができます。

Railsのドキュメント には次のコメントがあります-

# If you want to send the email now use #deliver_now
UserMailer.welcome(@user).deliver_now

# If you want to send the email through Active Job use #deliver_later
UserMailer.welcome(@user).deliver_later

この文言は、deliver_nowがメールを送信するためにActiveJobを使用しないように見せかけます。それは正しいですか、正しい場合、deliver_nowdeliver_laterの真の違いは何ですか?非同期ではありませんか?

同様に、同じ違いはperform_nowperform_laterにも当てはまりますか?

ありがとう!

19
user2490003

あなたの質問で言うように、deliver_nowActiveJobを使用しません。

基本的に、deliver_laterは非同期です。この方法を使用すると、電子メールは現時点では送信されず、ジョブのキューにプッシュされます。ジョブが実行されていない場合、電子メールは送信されません。 deliver_nowは、ジョブの状態に関係なく、現時点でメールを送信します。 ここdeliverメソッドのドキュメントを見ることができます。

2番目の質問によると、perform_nowはキューに送信せずにジョブをすぐに処理します。ただし、perform_laterはジョブをキューに追加し、ジョブのキューが解放されるとすぐにジョブを実行します。 ここperformメソッドのドキュメントを見ることができます。

21
Daniel Batalla

Daniel Batallaが書いたものに加えて、私が行ったもう1つの観察があります:deliver_laterは遅延評価を実行するようですが、deliver_nowは実行しません。

データベースに保存されていない追加属性reset_tokenを持つActiveRecordモデルがあります(これはMichael Hartlのrailstutorial.orgからのものです。モデルはreset_digest列にトークンのハッシュバージョンを保存します)。

deliver_nowを実行するときに、メーラービュー内の@modelreset_token属性にアクセスすると、期待どおりにリセットトークンが生成されます。ただし、deliver_laterを実行すると、@model.reset_tokenは常にnilになります。 deliver_laterはデータベースデータでモデルを更新するかのように見えます。reset_tokenはデータベースによってサポートされない追加の属性であるため、その時点ではnilになります。 (コードドキュメントはネストが深すぎるため、ソースでこれを確認できません。)

マイケルはチュートリアルでdeliver_nowを使用しています。私は彼が怠惰な評価を避けるためにこれをするのを知りません。しかし、テストに合格するためにdeliver_laterdeliver_nowに変更する必要があることを理解するのにしばらく時間がかかりました。

5
bovender