Ruby on rails Rails设计在Facebook注册后发送确认电子邮件

Ruby on rails Rails设计在Facebook注册后发送确认电子邮件,ruby-on-rails,facebook,devise,omniauth,mailer,Ruby On Rails,Facebook,Devise,Omniauth,Mailer,问题:用户首次注册Facebook后,我如何向他们发送电子邮件?我正在使用设备和omniauth 我有确认电子邮件,用于与Desive定期注册。当用户在登录Facebook后第一次被添加到我的数据库时,我需要发送一封电子邮件这在代码中的什么地方发生? 我尝试在omniauth\u回调\u控制器中添加一行代码发送电子邮件 class OmniauthCallbacksController < Devise::OmniauthCallbacksController # omniauth_ca

问题:用户首次注册Facebook后,我如何向他们发送电子邮件?我正在使用设备和omniauth

我有确认电子邮件,用于与Desive定期注册。当用户在登录Facebook后第一次被添加到我的数据库时,我需要发送一封电子邮件这在代码中的什么地方发生?

我尝试在omniauth\u回调\u控制器中添加一行代码发送电子邮件

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
class OmniAuthCallbackController:身份验证
如果是导航格式,设置flash消息(:notice,:success,:kind=>“Facebook”)?
#我把邮件发到这里了
其他的
会话[“device.facebook_data”]=request.env[“omniauth.auth”]
将\重定向到根\路径
结束
结束
然而,这只是在用户每次登录Facebook时发送一封确认电子邮件,这不是我想要的。我只想在他们第一次登录时发送电子邮件

电子邮件应在注册处发送。然而,当用户注册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
类注册控制器{:success=>true}
其他的
设置flash消息:注意,如果是导航格式,“已注册但{resource.inactive{message}”?
登录后,会话数据过期!
返回render:json=>{:success=>true}
结束
其他的
清除密码资源
无效的登录尝试
结束
结束
想知道在注册Facebook后向用户发送确认信息的正确方式。

问题 它看起来像您的
用户。from\u omniauth
函数的行为类似于
find\u或\u create
调用。这意味着控制器不知道用户是刚刚创建的还是正在从数据库中的现有标识获取的

如果用户是通过_omniauth调用创建的
,那么您应该能够只依赖designe
:confirmable
模块。否则,用户是在您获取OAuth凭据之前创建的,因此您需要手动处理它

from_omniauth
函数中的
代码可能如下所示:

def self.from_omniauth(token)
  user = User.find(token: token)
  if user.nil?
    user = User.create(token: token, ...)
    # ...
  end
  # ...
end
可能存在中间
标记
标识
,或其他此类类,但逻辑应该相同

修理 有两种简单的方法可以解决此问题:

  • 将创建的
    布尔值作为
    from\u omniauth
    返回值的一部分,然后控制器可以使用该返回值关闭确认电子邮件
  • 将“查找或创建”逻辑的“创建”部分移出控制器,以便电子邮件可以作为“创建”路径的一部分发送
  • 在一边
    另外,我建议使用designe
    资源。发送确认说明
    功能,并将您的电子邮件从中删除。这样,所有欢迎电子邮件共享相同的代码,并且您不需要为Facebook/OAuth登录维护单独的模块。

    您可以为Desive模型发布您的模型吗。通常,如果您使用:confirmable,在模型设计中将发送电子邮件。查看设计文档以了解详细信息。您还需要调整模型的迁移以存储令牌。是否有任何特定原因需要确认用户使用Facebook签名?