24

通常、メールの送信はモデルに対するアクションの後に呼び出されますが、メール自体は表示操作です。アクション メーラー メソッド呼び出しをどこに配置するかを決定するために、どのような質問を自問する必要があるかについて、あなたがどのように考えるかを探しています。

私はそれらを見た/使用しました:

  • モデル メソッドで - 関連しているが別個の関心事の不適切な結合?
  • モデルのコールバック (after_save など) - 私の現在の知識レベルでわかる限り、最良の分離。
  • コントローラーのアクションでは、間違っているように感じますが、これがコードを構成する最もスマートな方法である状況はありますか?

プログラミングの方法を知りたい場合は、プログラマーのように考える必要があります。そのため、特定のプログラミング ソリューションをどのように考えているかを学ぶことは、独学で何か月もコーディングする価値があります。ありがとうございました!

4

4 に答える 4

15

遅い答えですが、この件について合理化したいと思います:

通常、Web アプリでは、クライアントへの直接的な反応としてメールを送信します。または、ニュースレター/通知メールのようなものについて話している場合は、バックグラウンド タスクとして。

モデルは基本的にデータ ストレージ マッパーです。そのロジックは、データストレージ処理を伴うデータ処理/通信をカプセル化する必要があります。したがって、関係のないロジックを挿入するのは少し難しく、ほとんどの場合間違っています。例を見てみましょう: ユーザーがアカウントを登録し、確認メールを受け取る必要があります。この場合、確認メールは新しいアカウントの作成の直接的な影響であると言えます。ここで、Web アプリで行う代わりに、コンソールでユーザーを作成してみてください。その場合、コールバックをトリガーするのは間違っているように聞こえますよね? そのため、コールバック オプションをスクラッチしました。まだモデルにメソッドを書く必要がありますか? それがユーザーのアクション/入力の直接的な効果である場合は、そのワークフローに留まる必要があります。ユーザーが正常に作成された後、コントローラーに書き込みます。直接。コントローラーで呼び出されるモデルでこのロジックを複製すると、不要なモジュール性と、Action Mailer からの Active Record モデルの依存関係が追加されます。多くのアプリでモデルを共有することを検討してみてください。一部のアプリは Action Mailer を必要としません。上記の理由から、私は、メーラーの呼び出しは意味のある場所にすべきであると考えています。通常、モデルは次のとおりです。その場所ではありません。それがうまくいく例を挙げてみてください。

于 2012-09-24T09:35:10.590 に答える
4

まあ、依存します。

私はこれらすべてのオプションと、「なぜこれをどこに置くべきなのか?」についてのあなたの主張を使用しました。いいね。

モデルが特定の方法で更新されるたびに発生させたい場合は、それをモデルに入れます。たぶん、モデルのコールバックでも。

時々、あなたは単にレポートを送信しているだけです。何の更新もありません。その場合、私は通常、レポートを送信するインデックス アクションを持つリソースを取得しています。

メーラーが変更中のモデルに実際に関連していない場合は、それをコールバックに入れることができます。私はそう頻繁にはしません。モデルにカプセル化する可​​能性が高くなります。私はそれをしましたが、あまり頻繁ではありません。

于 2009-02-03T21:42:51.573 に答える
2

しばらく経っていることは承知していますが、ベスト プラクティスは決して消えませんよね? :)

電子メール定義上、非同期通信です (確認電子メールを除きますが、この電子メールであっても、確認が必要になる前に遅延を残すことをお勧めします)。

したがって、私の意見では、それを送信する最も論理的な方法は次のとおりです。

  • バックグラウンド アクションで ( Sidekiqまたはdelayed_jobを使用)
  • コールバック メソッド内: 「ねえ、このアクションは正常に完了しました。これで世界に伝えることができますか?」

Rails の問題は、(たとえば JS のように) コールバックが多すぎないことです。

after_save :callback

def callback
  if test_that_is_true_once_in_the_objects_life
    Mailer.send_email()
  end
end

したがって、本当にプログラマーのように考えたい場合は、アプリにカスタム コールバック システムを設定することをお勧めします。

例えば。

def run_with_callback(action, callback_name)
  if send(action)
    delay.send(callback_name)
  end
end

または、アプリ内にイベント システムを作成することも適切なソリューションです。

しかし、最終的には、これらのソリューションは時間的にかなり高価になるため、人々はアクションの後にインラインでそれを書くことになります

def activate
  [...]
  user.save
  Mailer.send_mail
  respond_to 
  [...]
end

これは、同期プログラミングのコールバックに最も近い方法であり、その結果、どこでも (Modelおよび でController) メーラーが呼び出されます。

于 2014-10-16T09:27:03.680 に答える