Создайте почтовую программу, которая отправляет электронные письма всем, кто прокомментировал сообщение

У меня есть блог, в котором есть модель комментирования каждого поста. У меня есть почтовая программа, настроенная так, что автор сообщения получает уведомление по электронной почте, когда кто-то прокомментировал его сообщение. Сейчас я хочу сделать оповещение по электронной почте, которое будет отправлено всем остальным пользователям, которые также прокомментировали этот пост. Я думаю, что мне понадобится оператор if/then, но я еще не совсем понял это.

Вот мой контроллер при создании сообщений:

def create
@post = Post.find(params[:post_id])
@blog_comment = @post.blog_comments.create(params[:blog_comment])
@blog_comment.user = current_user

respond_to do |format|
  if @blog_comment.save
    format.html { redirect_to @post, notice: 'Blog comment was successfully created.' }
    format.json { render action: 'show', status: :created, location: @blog_comment }
  else
    format.html { render action: 'new' }
    format.json { render json: @blog_comment.errors, status: :unprocessable_entity }
  end
end

Вот мой почтовик:

def blog_comment(user)
@user = user
mail(to: [user.email],
    bcc: ['[email protected]'],
   from: '[email protected]',
subject: 'Hi from theTens!')
end

В моделях: Каждое сообщение имеет_много_комментариев_блога, сообщения принадлежат_пользователю, комментарии_блога принадлежат_сообщению и принадлежат_пользователю.


person Tony Tambe    schedule 09.02.2014    source источник
comment
извините, а где код почтовой программы, которую вы хотите реализовать?   -  person phoet    schedule 10.02.2014
comment
Вот что я спрашиваю. Как мне реализовать этот почтовик? Мне нужно каким-то образом захватить всех пользователей, которые прокомментировали сообщение, а затем отправить им электронное письмо.   -  person Tony Tambe    schedule 10.02.2014
comment
Да, точно. сделай это.   -  person phoet    schedule 10.02.2014
comment
@phoet Таким образом, я могу получить пользователей, которые прокомментировали в консоли, используя что-то вроде post.comments.find(params[:id]).collect(&:user). Как бы я это реализовал? Я правильно указал в контроллере создания?   -  person Tony Tambe    schedule 18.05.2014
comment
везде, где это имеет для вас наибольший смысл. контроллер - хорошее начало.   -  person phoet    schedule 19.05.2014
comment
спасибо @phoet, я понял код, который мне нужно было написать.   -  person Tony Tambe    schedule 21.05.2014


Ответы (1)


Наконец-то я нашел решение. Вот мой код, который я написал внутри метода «создать» в моем контроллере комментариев:

respond_to do |format|
  if @comment.save
    format.html { redirect_to @post, notice: 'Comment was successfully created.' }
    format.json { render json: @comment, status: :created, location: @comment }

    @commenter = @post.comments.collect(&:user)
    @commenter = @commenter.uniq

    @commenter.each do |commenter|  
      MyMailer.commenter_email(commenter).deliver
    end  

  else
    format.html { render action: "new" }
    format.json { render json: @comment.errors, status: :unprocessable_entity }
  end
end

Итак, @commenter собирает массив всех пользователей, прокомментировавших этот пост. Затем мне пришлось сделать @commenter равным @commenter.uniq, чтобы, когда пользователь трижды комментирует пост, он не получал три письма каждый раз, когда кто-то еще комментирует.

Затем я просто сделал представление почтовой программы и метод commenter_email в my_mailer.rb.

Единственная проблема заключается в том, что если вы первый, кто комментирует, вы также получите электронное письмо, так как я включил почтовую программу после «сохранения» в контроллере.

person Tony Tambe    schedule 21.05.2014