允许Devise / OmniAuth-Facebook用户完成用户创建注册

时间:2014-08-08 16:19:16

标签: ruby-on-rails facebook ruby-on-rails-4 devise omniauth

在Rails 4中,我试图找出在OmniAuth Facebook成功登录后如何最好地重定向Devise用户。

当用户第一次使用OmniAuth-Facebook登录我的应用时,我必须将其用户模型中的一些变量(例如用户名)设置为默认值,但我希望用户确认或更改这些默认值。例如,如果有一个Facebook"昵称",我会用它来设置用户模型中所需的用户名,如果没有可用的昵称,则使用名字+姓氏。

如果用户是第一次使用Facebook登录,我只是在数据库中创建了他们的用户模型,我想将它们重定向到帐户编辑页面,并带有一条flash消息说明"更新您的帐户以完成注册"。如果用户之前已登录,我们会假设他们已经被告知他们的默认用户名并且知道它,所以我只是将它们重定向到默认目的地。

我认为这是典型的起点:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
    def facebook    
        # You need to implement the method below in your model (e.g. app/models/user.rb)
        @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

        if @user.persisted?
            sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated
            set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format?
        else
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
        end
    end
end

我知道我可以覆盖after_sign_in_path_for,但它不知道我对User.find_for_facebook_oauth的调用结果。如果我知道User.find_for_facebook_oauth创建了一个新用户,我可以将它们重定向到帐户编辑页面(通过重写的after_sign_in_path_for方法),这样他们就可以查看任何默认值并进行更改。我知道我可以通过在用户模型的数据库模式中放置一个标志来解决这个问题,但这似乎有些过分。例如,我可以为&#34; is_new_user&#34;添加新的数据库字段,当User.find_for_facebook_oauth保存新用户时将启用该字段,该用户由after_sign_in_path_for读取,并且每当查看帐户编辑页面时都禁用。我不喜欢这种方法,如果after_sign_in_path_for知道当前的omniauth请求中发生了什么,我会更喜欢它,并采取相应的行动。我不需要在数据库中添加字段。

我希望这是有道理的。谢谢你的任何建议!

1 个答案:

答案 0 :(得分:0)

感谢@anonymousxxx,解决方案很简单。 Devise已经将:sign_in_count列添加到我的User模型中,因此引用它可以为我提供所需的所有信息!