Rails - Разработайте отправку электронной почты пользователя после регистрации / создания

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

Я пытаюсь добиться того, чтобы пользователь подписался, он отправил электронное письмо администратору, а затем администратор должен включить пользователя. В настоящее время, когда администратор разрешает пользователю, он отправляет им электронное письмо, но по какой-то причине мой вновь созданный пользовательский адрес электронной почты не срабатывает. Я думаю, это потому, что мой метод create не срабатывает, куда мне его поместить? Мне нужно перезаписать пользовательский метод?

Мой контроллер UserMailer:

class UserMailer < ActionMailer::Base
  default from: "[email protected]"
  def send_enabled_message(user)
    @user = user
    mail(:to => user.email, :subject => "Welcome to Pixel Technologies!!!")
  end
  def send_new_user_message(user)
    @user = user
    mail(:to => '[email protected]', :subject => "New User created please review and enable.")
  end
end

Мой users_controller:

class UsersController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource

# POST /users
def create
  @user = User.new(user_params)
  puts "******************** NEW USER ****************************"
  puts user_params
  if @user.save
    puts 'Sending email for create user'
    UserMailer.send_new_user_message(@user).deliver
    redirect_to @user, notice: 'User was successfully created.'
  else
    render action: 'new'
  end
end

Но этот метод создания никогда не запускается. Что я делаю не так. Есть ли еще один метод, который мне нужен для установки UserMailer.send_new_user_message (@user) .deliver?


person user1434177    schedule 05.07.2013    source источник
comment
Когда пользователь регистрируется, создается ли пользователь на этом этапе? Если это так, то, возможно, ваше электронное письмо должно быть отправлено по методу обновления пользователя, если администратор каким-то образом разрешает пользователю, что трудно увидеть из этого без всего потока ...   -  person tronmcp    schedule 05.07.2013


Ответы (2)


Когда пользователи регистрируются в Devise, они не проходят UsersController.

Вы можете добавить код отправки почты в модель User.

Например, в app/models/user.rb:

class User < ActiveRecord::Base
  # ...

  after_create :send_admin_mail
  def send_admin_mail
    UserMailer.send_new_user_message(self).deliver
  end

  # ...
end

Это делается с помощью обратного вызова Active Record after_create.

person Domon    schedule 05.07.2013
comment
На мой взгляд, этот способ обратного вызова лучше. +1 - person sergserg; 25.08.2014
comment
Превосходно. Быстро и грязно. Работает отлично. - person nulltek; 21.08.2015
comment
Если это не удастся, транзакция будет отменена, и объект не будет сохранен в базе данных. Как насчет использования after_commit вместо after_create? - person Rahul Roy; 11.01.2016
comment
after_commit также запускается при обновлении и уничтожении, так что это не очень хорошая идея. Есть ли способ предотвратить откат? - person Rahul Roy; 11.01.2016
comment
@RahulRoy В Rails 4 вы можете добавить true в конец метода. В Rails 5 обратные вызовы не прекращаются, если :abort не thrown. - person Domon; 13.01.2016

Письма с подтверждением должны быть отправлены с контроллера. Devise::RegistrationsController значения по умолчанию просто отменить.

Создайте файл app/controllers/my_registrations_controller.rb (назовите его как хотите)

class MyRegistrationsController < Devise::RegistrationsController

  def create
    super
    if @user.persisted?
      UserMailer.new_registration(@user).deliver
    end
  end

end

Тогда в ваших маршрутах:

devise_for :users, :controllers => { :registrations => "my_registrations" }
person Dex    schedule 08.01.2014
comment
Вы должны добавить if @user.errors.empty?, иначе вы будете отправлять электронные письма, даже если регистрация не удалась. - person Alex Siri; 18.02.2014
comment
@AlexSiri @Dex IMO, возможно, было бы лучше использовать @user.persisted?, чтобы убедиться, что пользователь действительно сохранен в базе данных - почти наверняка поведение будет таким же, но это безопаснее, и я думаю, что намерение более ясное. - person Filipe; 19.02.2014
comment
Это должен быть принятый ответ. Контроллер - гораздо более подходящее место для отправки электронных писем, чем модель. - person alexpls; 03.06.2014
comment
Я согласен с тем, что во многих случаях мы должны отправлять электронные письма от контроллера. Но если вы используете devise, вы фактически отправляете пользователям электронные письма с уведомлениями из модели. Мой ответ означал следовать соглашению. - person Domon; 28.01.2015
comment
@Domon Я предпочитаю не спамить, когда создаю пользователей из сидов. Объект модели может быть создан разными способами, не только в результате взаимодействия с пользователем. - person sekrett; 15.04.2017