Фишки Rails. Мейлеры

Кратко рассмотрим возможности работы с почтой в Rails

Генерация

$ rails g mailer CommentMailer post_commented
    # create app/mailers/comment_mailer.rb
    # invoke erb
    # create app/views/comment_mailer
    # create app/views/comment_mailer/post_commented.text.erb

Мейлер

class CommentMailer < ActionMailer::Base
    default from: 'notifications@midispot.ru'

    def post_commented(post, comment)
        @post = post
        @author = post.author.name
        @comment = comment

        attachments['congrats.png'] = File.read("#{Rails.root}/public/congrats.png")

        mail to: post.author.email, subject: 'Ваш пост был прокомментирован'
    end
end

Вьюхи мейлера

Можно слать как простой текст (app/views/comment_mailer/post_commented.text.erb), так и html. Для этого нужно переименовать вьюху в app/views/comment_mailer/post_commented.html.erb. Можно также иметь и 2 вьюхи, тогда письмо будет содержать и текст, и html, а решать, что показывать пользователю, будет его почтовик.

# app/views/comment_mailer/post_commented.text.erb

Привет, <%= @author %>!
Некто <%= @comment.author %> прокомментировал твой пост "<%= @post.title %>", написав:
<%= @comment.body %>
# app/views/comment_mailer/post_commented.html.erb

<h1>Привет, <%= @author %>!</h1>
<p>Некто <%= @comment.author %> прокомментировал твой пост "<%= link_to @post.title, post_url(@post) %>", написав:</p>
<p><%= @comment.body %></p>

Отправка письма

# /app/models/comment.rb
class Comment < ActiveRecord::Base
    # ...
    after_save :comment_added_notification

    private

    def comment_added_notification
        CommentMailer.post_commented(self.post, self).deliver
    end
end