2015-08-28 2 views
1

Я сейчас в теме Jessica Biggs's Creating a Scoped Invitation System for Rails codewall.com учебник.Rails 4: настроить модель ActionMailer

В Пригласительный Форма разделе Отправить, автор говорит:

Мы также потребуется Mailer для отправки электронной почты. Почтовый адрес приглашения очень простой, поэтому я не собираюсь вдаваться в подробности, но он отправит на адрес электронной почты вновь созданного приглашения и включит URL-адрес приглашения , который мы построим позже. Почтовая программа будет иметь 2 методов, одна для отправки его приглашения для новых пользователей и одна для , отправляющая уведомление по электронной почте существующим пользователям.

Поскольку я не очень опытный с Rails в целом и ActionMailer в частности, я пытался понять, что автор говорит от Rails Guides Action Mailer Basics.

Итак, я побежал rails g mailer InviteMailer генерировать свою почтовую программу и добавил следующие действия:

class InviteMailer < ApplicationMailer 

    def invite_new_user 
    @link = new_user_registration_path(:invite_token => @invite.token) 
    mail to: @invite.email, subject: "Calendar Invitation" 
    end 

    def notify_existing_user 
    end 

end 

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

Любой намек, указывающий на меня в правильном направлении, будет высоко оценен.

+0

Спасибо за ссылку Макс. На самом деле это ресурс, о котором я говорю в своем вопросе, когда я говорю «Rails Guide». Я собираюсь обновить его для большей ясности. Проблема в том, что я с трудом переводил содержание цитаты в реальный Mailer, даже используя документацию. Я надеялся, что кто-то может указать мне в правильном направлении. –

+0

Я пропустил ссылку в своем первом чтении. Вот почему я удалил комментарий. – max

+0

Нет проблем. Спасибо, что нашли время, чтобы посмотреть на мой вопрос;) –

ответ

3

Итак, у вас есть класс Mailer и методы.

Mailers очень похожи на контроллеры Rails. Они также имеют методы под названием actions и используют views для структурирования контента. Где контроллер генерирует содержимое, подобное HTML, чтобы отправить обратно клиенту, Mailer создает сообщение, которое будет доставлено по электронной почте.

Теперь вам нужно определить notify_existing_user действие вашей почтовой программы, вы хотите отправить по электронной почте к существующему пользователю говоря Thanks for signing up! Таким образом, вы должны добавить:

class InviteMailer < ApplicationMailer 
    default from: '[email protected]' 

    def notify_existing_user(user) 
    @user = user 
    mail(to: @user.email, subject: 'Thanks for signing up!') 
    end 
end 

default Hash - Это хэш значений по умолчанию для любого отправляемого вами по электронной почте .

Таким образом, вы можете использовать свой электронный адрес здесь, как с адреса электронной почты.

Теперь вам нужно создать Mailer Вид:

notify_existing_user.html.erb в app/views/invite_mailer/.Это будет шаблон, используемый для электронной почты, отформатированный в HTML:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> 
    </head> 
    <body> 
    <h1>Welcome to example.com, <%= @user.name %></h1> 
    <p>Thanks for signing up!</p> 
    </body> 
</html> 

Вы также можете создать текстовый вид notify_existing_user.text.erb в app/views/invite_mailer/:

Welcome to example.com, <%= @user.name %> 
=============================================== 

Thanks for signing up! 

Mailers действительно просто еще один способ для визуализации Посмотреть. Вместо , отображая представление и отправляя HTTP-протокол, они просто отправляют его через почтовые протоколы. В связи с этим, имеет смысл просто попросить вашего контроллера сообщить Mailer отправить сообщение , когда пользователь будет успешно создан.

Давайте создадим простой пользовательский эшафот:

rails generate scaffold user name email login 
rake db:migrate 

Затем, вы можете вызвать метод InviteMailer.notify_existing_user из ваших users_controller как следующее:

class UsersController < ApplicationController 
    def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     # Tell the InviteMailer to notify the existing user that just been created 
     InviteMailer.notify_existing_user(@user).deliver_later 

     format.html { redirect_to(@user, notice: 'User was successfully created.') } 
     format.json { render json: @user, status: :created, location: @user } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

Вот и все. Теперь, когда вы создаете пользователя и когда пользователь будет сохранен, ему будет отправлено электронное письмо с использованием метода notify_existing_user вашего InviteMailer.

+0

Добавил аргумент пользователя 'notify_existing_user', иначе он просто даст ошибку« Неверное количество аргументов » – max

+0

@max, я быстро написал ответ в начале и не смог найдите время, чтобы проверить. Спасибо за редактирование. –

1

Прежде всего, ваша почтовая программа должна знать, к какому пользователю он должен быть отправлен по электронной почте. Поэтому мы добавляем пользовательский аргумент. Остальное довольно просто: мы просто вызываем почту, которая создает почтовый объект, она неявно возвращается.

class InviteMailer < ApplicationMailer 
    def invite_new_user(user, invite) 
    @user = user 
    @invite = invite 
    mail(to: user.email, subject: 'Welcome! ...') 
    end 

    def notify_existing_user(user) 
    @user = user 
    mail(to: user.email, subject: 'Sorry to nag you ...') 
    end 
end 

mail будет автоматически искать для следующих шаблонов и добавить их в теле сообщения электронной почты.

<%# app/views/invite_mailer/invite_new_user.html.erb %> 
<h1>Your are cordially invited to ...</h1> 
Add the invitation link here. The invitation is available as @invite. 

<%# app/views/invite_mailer/notify_existing_user.html.erb %> 
<h1>Yo dude ...</h1> 

Обратите внимание, что если вы хотите отправить многочастный открытый текст/HTML электронной почту необходимо создать .text.erb вид, а также. Отправка простой текстовой версии обычно является хорошей идеей.

Чтобы позвонить в наш почтовик мы хотели бы сделать что-то вроде:

class InvitationsController 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    @invite = Invitation.new 
    # @todo generate some kind of invitation token. 

    if @invite.save 
     InviteMailer.invite_new_user(@user, @invitation).deliver_later 
     redirect_to users_path, notice: 'invitation sent' 
    else 
     render :new 
    end 
    end 

    def user_params 
    params.require(:user).permit(:email) 
    end 
end 
+0

Это немного отличается от учебника, но я надеюсь, что вы получите основной смысл - Mailers похожи на контроллеры, но для электронной почты. Действия Mailer должны возвращать почтовый объект. Передайте все необходимые зависимости в действие. – max

Смежные вопросы