【问题标题】:Rails 3.1 Devise Oauth for Facebook routing confusionRails 3.1 为 Facebook 路由混淆设计 Oauth
【发布时间】:2012-03-01 23:08:23
【问题描述】:

关注后:

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

我可以通过 Facebook 注册用户。但我正在努力定义自己的重定向。

显然,已经注册/登录 facebook 的现有用户重定向到我的应用程序并继续使用是完美的,但对于通过我感兴趣的 facebook 新创建的用户来说,情况就是这样。

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

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

user.persisted 是什么意思? find_for_facebook_oauth 的作用与设计 wiki 页面规定的相同;即通过电子邮件查找用户,如果存在则返回,如果不存在,则使用自动生成密码创建新用户。

但我需要它将新创建的用户重定向到他们设置密码的页面。我不希望存根密码持续存在,我希望用户立即看到一个屏幕,以 a) 确认他们的姓名和 b) 确认他们的密码。

我在views/devise/invitations/edit 中为接受邀请(通过https://github.com/scambra/devise_invitable/)的人实现了这样一个屏幕——如果它可以工作,这将非常适合这个。

我应该在哪里添加重定向以及这种重定向采用什么格式?我发现上面的 facebook 方法很难解释。我不明白为什么它会重定向到新的用户注册 url - 用户已创建或存在,那么持久性与什么有关?

显然很困惑,因此感谢您的帮助。 :)

谢谢,

戴夫

【问题讨论】:

    标签: ruby-on-rails facebook oauth devise


    【解决方案1】:

    .persisted? 方法检查该记录是否保存在您的数据库中。这是该方法检查用户是否成功找到或创建的方法。如果没有,它会重定向到new_user_registration_url,因为注册不成功(允许用户重试)。

    要根据用户是否是新用户进行重定向,您可以检查用户对象是否有一些表明他们是新用户的标志。你提到了密码,所以这样的东西可以工作(未经测试):

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      if @user.password.exists?
        sign_in_and_redirect @user, :event => :authentication
      else
        sign_in @user
        redirect_to ______ #insert path to set password etc
      end
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
    

    另一种选择(如果您想获得更多微调)您可能需要自定义after_sign_in_path_for(resource_or_scope),如on the Devise wiki 所述

    【讨论】:

    • 你是对的。我使用 sign_in_count (设计的一部分)来确定它是否是用户首次登录。感谢您的明确解释。
    • @Dave:代码应该写在哪个视图文件中?
    • persisted? 是一个 ActiveRecord 方法。和new_record?apidock.com/rails/ActiveRecord/Persistence/persisted%3F基本相反
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2011-07-11
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多