2013-08-22 4 views
3

Итак, у меня есть этот сайт, который я построил http://leapfm.com/, и все больше и больше пользователей объединяются, что является фантастическим. Я заметил, что пользователи снова заходят, чтобы проверить, была ли их песня проголосована. Я хотел бы автоматизировать этот процесс для них.Уведомления по электронной почте на Rails

Итак, я хотел бы реализовать функцию, которая отправляет пользователю электронное письмо, когда их песня будет проголосована. Я не уверен, что это возможно с моим стеком.

E.g. для голосования я использую this gem.

Могу ли я реализовать что-то подобное? Если вам нужно предоставить дополнительную информацию, не бойтесь спросить.

song_controller Snippit (создать действие):

def create 
    @song = Song.new(song_params) 
    @song.user = current_user 
    respond_to do |format| 
     if @song.save 
     format.html { redirect_to @song, notice: 'Song was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @song } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @song.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+1

Как насчет комбинации Rails Mailer и отсроченного задания? – Mindbreaker

+1

Вы, кажется, хотите упомянуть драгоценный камень, который вы используете для голосования? –

+1

Извините, я обновил сообщение с помощью драгоценного камня. И Mindbreaker, я это рассмотрю, спасибо! – Apane101

ответ

5

Это должно быть довольно просто. То, что вы хотели бы сделать, - это отправлять электронную почту каждый раз, когда создается запись о голосовании. Во-первых, в вашей модели Vote вы должны настроить обработчик after_commit при создании экземпляра.

class Vote 
    ... 
    after_commit :send_email, :on => :create 

    def send_email 
    # send the email to whoever owns votable 
    end 
end 

Внутри участка # send the email есть несколько вариантов. Самым простым было бы просто настроить ActionMailer и доставить электронную почту в этом методе send_email. Существует несколько способов настройки этого параметра. Тот, который я недавно использовал, был Postmark, для которого вы установили бы postmark-rails и добавили что-то вроде следующего к вашему config/environments/production.rb.

config.action_mailer.delivery_method = :postmark 
config.action_mailer.postmark_settings = { :api_key => 'your-api-key' } 

Однако я призываю вас, чтобы проверить различные поставщиков, чтобы найти тот, который соответствует вашим потребностям (я могу думать о Postmark, SendGrid, Mailgun).

Затем запустите rails generate mailer VoteMailer, что создаст класс VoteMailer под номером app/mailers/vote_mailer.rb. Отредактируйте его в соответствии с вашими потребностями.

class VoteMailer < ActionMailer::Base 
    default from: '[email protected]' 

    def vote_notification(voter, song) 
    @voter = voter 
    @song = song 
    @user = @song.user 
    mail(to: @user.email, subject: 'Someone voted on your song!') 
    end 
end 

Теперь вы создаете шаблон в app/views/vote_mailer/vote_notification.text.erb.

Hey <%= @user.name %>, 

Someone voted on your song, <%= @song.name %>! 

Congrats! 

Затем, используя почтовую программу в методе send_email.

class Vote 
    ... 
    def send_email 
    VoteNotifier.vote_notification(voter, voteable).deliver! 
    end 
end 

Это должно заставить вас начать.

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

Чтобы избежать этой проблемы, люди будут принимать более трудоемкие части своего запроса на сервер и вставлять их в очередь заданий, которая будет обрабатываться другим сервером. Для достижения этой цели с вашей электронной почты, вы могли бы установить delayed_job_active_record и изменить свой send_email метод:

class Vote 
    ... 
    def send_email 
    VoteNotifier.delay.vote_notification(voter, voteable) 
    end 
end 

И затем в отдельном процессе на сервере, выполнить задачу jobs:work Rake.

bundle exec rake jobs:work 

Этот процесс должен работать 24 часа в сутки, 7 дней в неделю, как и процесс веб-сервера.

+0

спасибо Бенджамин, с нетерпением жду отложенной части работы - это фантастика! – Apane101

+0

Я только что обновил его. Не стесняйтесь спрашивать, есть ли у вас больше вопросов. –