Rails Devise Отправить электронное письмо с подтверждением после регистрации в Facebook

Проблема. Как отправить пользователю электронное письмо после его первой регистрации на Facebook? Я использую устройство и omniauth.

У меня есть электронные письма с подтверждением, работающие для обычной регистрации с devise. Мне нужно отправить электронное письмо, когда пользователь впервые добавляется в мою базу данных после входа в Facebook. Где это происходит в коде?

Я попытался добавить строку кода для отправки электронной почты в свой omniauth_callbacks_controller.

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

# omniauth_callbacks_controller

def facebook
    @user = User.from_omniauth(request.env["omniauth.auth"])
    facebook = "www.facebook.com"

    if @user.persisted?
        print "User persisted"
        sign_in @user, :event => :authentication
        set_flash_message(:notice,:success,:kind => "Facebook") if is_navigational_format?

        # I SENT THE EMAIL HERE

    else
        session["device.facebook_data"] = request.env["omniauth.auth"]
        redirect_to root_path
    end
end

Однако это просто отправляет пользователю электронное письмо с подтверждением КАЖДЫЙ раз, когда он входит в систему через Facebook, а это не то, чего я хочу. Я хочу просто отправить электронное письмо при первом входе в систему.

Электронное письмо должно быть отправлено в файл Registrations_controller. Однако, когда пользователи регистрируются в Facebook, этот контроллер никогда не используется.

class RegistrationsController < Devise::RegistrationsController

def create
build_resource(sign_up_params)
if resource.save
  if resource.active_for_authentication?
    set_flash_message :notice, :signed_up if is_navigational_format?
    sign_up(resource_name, resource)
    # Tell the UserMailer to send a welcome email after save
    UserMailer.welcome_email(current_user).deliver_later
    return render :json => {:success => true}
  else
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
    expire_session_data_after_sign_in!
    return render :json => {:success => true}
  end
else
  clean_up_passwords resource
  invalid_signin_attempt
end
end

Хотел бы знать, как правильно отправить подтверждение пользователю после регистрации в Facebook.


person xshen    schedule 11.02.2017    source источник
comment
Вы можете опубликовать свою модель для модели разработки. Обычно, если вы используете :confirmable в модели, устройство отправит электронное письмо. Подробности см. в документации по разработке. Вам также необходимо настроить миграции для модели для хранения токенов.   -  person KcUS_unico    schedule 12.02.2017
comment
Есть ли какая-то особая причина, по которой вы хотите подтверждать, что пользователи подписываются через Facebook?   -  person kurenn    schedule 12.02.2017


Ответы (1)


Проблема

Похоже, ваша функция User.from_omniauth ведет себя как вызов find_or_create. Это означает, что контроллер не знает, был ли пользователь только что создан или извлекается из существующего удостоверения в базе данных.

Если пользователь создается как часть этого вызова from_omniauth, то вы можете просто положиться на модуль Devise :confirmable. В противном случае пользователь создается до того, как вы вернете учетные данные OAuth, поэтому вам придется обрабатывать его вручную.

Код в функции from_omniauth, вероятно, выглядит примерно так:

def self.from_omniauth(token)
  user = User.find(token: token)
  if user.nil?
    user = User.create(token: token, ...)
    # ...
  end
  # ...
end

Может быть посредник Token, Identity или другой подобный класс, но логика должна быть той же.

Исправить

Есть два простых способа это исправить:

  1. Включите логическое значение created как часть возвращаемого значения from_omniauth, которое контроллер затем может использовать для отправки электронного письма с подтверждением.
  2. Переместите часть «создать» логики «найти или создать» в контроллер, чтобы электронное письмо можно было отправить как часть пути «создать».

В стороне

Кроме того, я бы предложил использовать функцию Devise resource.send_confirmation_instructions и добавить к ней вашу электронную почту. Таким образом, все приветственные письма используют один и тот же код, и вы не поддерживаете отдельный модуль только для входа через Facebook/OAuth.

person drs    schedule 12.02.2017