Уведомление по электронной почте (пользователю) после почтовой формы на Rails

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

Мне удалось получить уведомление (по электронной почте) всякий раз, когда кто-то подписывается на мой сайт. Теперь я хочу отправить пользователю уведомление с благодарностью.

Что я имею:

/модели/contact.rb

class Contact < MailForm::Base
  attribute :name
  attribute :email,     :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :message
  attribute :nickname,  :captcha  => true
  def headers
    {
      :subject => "New Subscription:",
      :to => "[email protected]",
      :from => "[email protected]"
    }
  end
end

/controllers/contacts_controller.rb

class ContactsController < ApplicationController
  def create
      @contact = Contact.new(params[:contact])
      @contact.request = request
      if @contact.deliver
        redirect_to(:back)
      else
        #TODO fail notification
        redirect_to(:back)
      end
  end
end

Что я пробовал:

  • Использование класса ActionMailer::Base для отправки электронных писем, но я не могу получить params[:contact][:email] из формы и поэтому не могу отправить ответ по электронной почте
  • Отправить несколько электронных писем с помощью почтовой формы, но я этого не добился

Моя проблема в том, что у меня нет пользовательской модели, и она мне не нужна, так как в этом приложении не будет места для хранения.


person fmlopes    schedule 16.06.2016    source источник


Ответы (1)


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

Вот некоторые из изменений:

bin/rails g model Contact name:string email:string message:text is_sent:boolean

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

Поэтому вместо использования model.contact и наследования от MailForm::Base я создаю модель контактов, которая будет хранить ваши контакты в базе данных. Я думаю, что это хорошая практика, поскольку вы можете получить ссылку на этих пользователей позже и потенциально создать из них учетную запись пользователя или сделать что-то еще полезное.

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

def create
  @contact = Contact.create(contact_params)
  if @contact.persisted?
    ContactMailer.say_thank_you(@contact).deliver_now
    ContactMailer.notify_webmaster(@contact).deliver_now
    # do the success redirect...
  else
    # do the failed redirect...handle error etc
  end

Таким образом, вы сначала сохраните запись в базе данных, проверьте, сохранена ли она, а затем уведомите пользователя и веб-мастера с помощью другого шаблона электронной почты. Для создания метода электронной почты с действием, который я использовал в примере say_thank_you и notify_webmaster, обратитесь к руководствам по началу работы.

http://guides.rubyonrails.org/action_mailer_basics.html

Поскольку вы новичок в рельсах, я предположил, что вы знакомы с созданием миграций и разрешением параметров contact_params....params.require(:contact).permit(:name.... - вы можете использовать шаблон по умолчанию и проверить сгенерированный код внутренний контроллер.

В приведенном выше примере я использую is_sent логическое свойство, для которого по умолчанию установлено значение false. Затем, как только ActionMailer отправляет электронное письмо, я обновляю это поле или повторяю попытку позже. Просто чтобы узнать, какие люди получили электронную почту, но это необязательно.

Надеюсь, поможет.

person Mirza Memic    schedule 16.06.2016