0

誰かが彼の投稿にコメントしたときにユーザーに電子メール通知を送信するためのこの短くて単純なコードがあります。私が懸念しているのは、このスニペットの場所です。

if user.settings.enabled_notifications && some_other_conditions
    NotificationMailer.notify_topic_owner(comment,owner)
end

notify_topic_owner()渡されたパラメータに従ってメールを送信するだけです。

基本的にsome_other_conditions、メールを送信するために真と評価されるいくつかの3〜4の条件を含めます。したがって、明らかにコントローラーはこのコードに適した場所ではありません(コントローラーコードは軽くてクリーンでなければならないことをどこかで読みました)。ヘルパーにはビューのコードが含まれているため、このスニペットをヘルパーに移動できるとは思いません。繰り返しになりますが、コードは実際にはモデルに関するものではないため、モデルは正しく見えません(またはそうではありませんか?)。

この短いスニペット用に新しいモジュールを作成しますか?今後は、このような鈍い混乱のベストプラクティスや参考資料についても教えていただければ幸いです。私はこれにかなり頻繁に苦労しています!

4

3 に答える 3

3

あなたは正しい質問をしている。さらに一歩進んで、OOPを試してみませんか:(以下のコードは理想的ではありませんが、アプローチ方法についての良いアイデアが得られるはずです)。「some_other_conditions」は、ドメインロジックに適合する場所で最もよく知っているものである可能性が高いため、考慮していません。

# A class for notification. I usually avoid depending directly on xxxMailer and similar
class Notifier

  # Inject the recipient
  def initialize(recipient)
    @recipient = recipient
  end

  def topic_commented(comment)
    # Only let Notifier know that NotificationMailer exists. (not perfect OOP. could inject this too)
    NotificationMailer.notify_topic_owner(comment,@recipient) if @recipient.notifications_enabled? # Ideally should be telling, not asking. Oh well.
  end


end



class User
  # Sprinkling of Law of Demeter
  def notifications_enabled?
    settings.enabled_notifications
  end
end

あなたはNotifier.new(current_user).topic_commented("Hello World")。将来的には、 SMSの送信、信号の発煙、印刷、データベースへの書き込みなどを、多くの場所でtopic_commented発信コードlkeを変更することなく行うことができます。NotificationMailer.xxxx

于 2012-08-11T06:28:11.233 に答える
1

これをコントローラーに入れると何が悪いのかわかりません。それがコントローラーのメソッドに関連している場合、それは間違いなくそこに行くことができます。保存などの後で呼び出された場合は、おそらくモデルに移動できます。

一般的に、ベストプラクティスは、モデルとクラスにできるだけ多くのものを入れるようにすることだと思います。コントローラ固有のコード用にコントローラを保存します。ヘルパーには、ビューでのコンテンツのレンダリングに関連するコードのみを含める必要があります。多くの場合、コントローラーにコードを取り込んで、リファクタリング中にモデルに移動します。とにかく私の意見:)

于 2012-08-11T06:26:49.473 に答える
1

私がそれについて考えるのに使用する慣習は、「コメントが追加されるたびに、どのようなアクションであっても、メールを送信する必要がありますか?」です。将来、コメントを追加する自動システムを実装した場合、その場合はメールを送信する必要があるかどうかを検討してください。もしそうなら、それはおそらくモデルコードです。それ以外の場合は、コメントが追加された方法と、コントローラーコードに関連しています。

于 2012-08-11T06:31:14.453 に答える