Это должно быть довольно просто. То, что вы хотели бы сделать, - это отправлять электронную почту каждый раз, когда создается запись о голосовании. Во-первых, в вашей модели 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 дней в неделю, как и процесс веб-сервера.
Как насчет комбинации Rails Mailer и отсроченного задания? – Mindbreaker
Вы, кажется, хотите упомянуть драгоценный камень, который вы используете для голосования? –
Извините, я обновил сообщение с помощью драгоценного камня. И Mindbreaker, я это рассмотрю, спасибо! – Apane101