1

ユーザーがワークアウトを追跡できる Ruby on Rails アプリケーションを作成しました。は、プライベートまたはパブリックのいずれかでこれを行うことができます。公開されているワークアウト ( workout.share == 1) について、ユーザーがコメントできるようにします。ワークアウトにコメントが作成されると、ワークアウトの所有者にメールで通知されます。それはすべてうまくいきます。

私は現在、ワークアウトにコメントしたユーザーに電子メールで通知できるようにするための最善の方法についてアドバイスを求めています. ここに例があります。

ユーザー A がワークアウト 1 を作成します。ユーザー B がワークアウト 1 にコメントし、ユーザー A が電子メール通知を受け取ります。ユーザー C もワークアウト 1 にコメントし、ユーザー A とユーザー B の両方が電子メール通知を受け取ります。

ワークアウト 1 にコメントしたすべてのユーザーをループして、電子メールを送信するようにアプリケーションに指示する最良の方法は何ですか?

現在、私はワークアウトの所有者に、comments_controller に次のコードを含むメールを送信しています (これはよりクリーンなコードになる可能性があることを認識しています)。

class CommentsController < ApplicationController

...


def create
     @workout = Workout.find(params[:workout_id])
     @comment = @workout.comments.build(params[:comment])
     @comment.user = current_user

     respond_to do |format|
       if @comment.save
         if @comment.workout.email_notification == 1
          @comment.deliver_comment_notification_mail!
          format.html { redirect_to( projects_path) }
          format.js
        else
          format.html { redirect_to( projects_path) }
          format.js
        end
      else
      end
    end
  end

...

そしてcomment_mailer.rbで

def comment_notification_mail(comment)

     subject       "Someone commented on your Workout"
     recipients("#{comment.workout.user.username} <#{comment.workout.user.email}>")
     from("foobar")
     body         :comment => comment,
                  :commenter => comment.user,
                  :workout => comment.workout,
                  :commentee => comment.workout.user,
                  :workout_url => workout_url(comment.workout),
                  :commenter_url => user_url(comment.user)


   end
4

2 に答える 2

1

ワークアウトのオーナーとコメンターを見つけるのは難しい仕事ではありません。私の提案は次のとおりです。

  1. 次のように使用して、コントローラーでメールを送信するコードをモデルに移動します#after_create

    class Comment < ActiveRecord::Base
      #...
      after_create :notify_subscribers
    
    
      def subscribers
        (self.workout.commenters << self.workout.owner).uniq
      end
    
    
      def notify_subscribers
        #... implemented below
      end
    end
    
  2. delayd_jobまたは他のツールを使用して、電子メール送信ジョブをバックグラウンドに置くか、すべての電子メールが送信されるまで要求がブロックされます。例えば、#notify_owner_and_commenterメソッドで

    def notify_subscribers
      self.subscribers.each do |user|
        CommentMailer.send_later :deliver_comment_notification_mail!(self, user)
      end
    end
    

    #deliver_comment_notification_mail!次に、2つの引数を使用してメソッドをリファクタリングする必要があります。

遅延ジョブ参照:https ://github.com/tobi/delayed_job

于 2010-12-12T06:48:28.487 に答える
0

私の視点から見ると、それはすべてメーラーの仕事です。私は、comment_notification_mail をより中立的なもの (ワークアウトの所有者やコメント投稿者に伝えることができるもの) に書き直します。

次に、次のようなもの:

def comment_notification_mail(comment)

 recs = [comment.workout.user]
 recs << comment.workout.comments(&:user)
 recs -= comment.user

 subject  "Someone commented on your Workout"
 recipients(recs.inject('') { |acc, r| "#{r.username} <#{r.email}>" })
 from("foobar")
 body     :comment => comment,
          :commenter => comment.user,
          :workout => comment.workout,
          :commentee => comment.workout.user,
          :workout_url => workout_url(comment.workout),
          :commenter_url => user_url(comment.user)
end

もちろん、メールが公開されるべきでない場合は、bcc で送信してください ;)

于 2010-12-12T06:57:42.940 に答える