首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集成邪恶、设计和Omniauth-Facebook

集成邪恶、设计和Omniauth-Facebook
EN

Stack Overflow用户
提问于 2014-02-15 14:04:40
回答 1查看 666关注 0票数 0

我正在开发一个应用程序,使用这三个创业板,我在这篇文章的标题中写到。我用可确认模块(?)设置了devise,所以当用户使用其电子邮件/密码创建帐户时,它会收到确认电子邮件。如果用户注册了facebook (使用无所不在的facebook创业板),则可以跳过确认步骤。

在user.rb中

代码语言:javascript
复制
    "Of course the :confirmable is active in the model"
    ...

    # Omniauth-facebook
    def self.find_for_facebook_oauth(auth)
      where(auth.slice(:provider, :uid)).first_or_create do |user|
        user.provider = auth.provider
        user.uid = auth.uid
        user.email = auth.info.email
        user.password = Devise.friendly_token[0,20]
        user.first_name = auth.info.first_name
        user.last_name = auth.info.last_name
        user.skip_confirmation!
        # user.image = auth.info.image # assuming the user model has an image
      end
    end

    ...

当我为巫师添加邪恶的宝石时,事情就来了。我配置了路由文件

在routes.rb中

代码语言:javascript
复制
MyApp::Application.routes.draw do

  devise_for :users, :controllers => { :omniauth_callbacks =>  "users/omniauth_callbacks",
          :registrations => "registrations" }

  root 'home#index'

  # Registration wizard routes
  resources :after_register
end

我创建了一个registration_controller来覆盖devise注册方法。

代码语言:javascript
复制
    class RegistrationsController < Devise::RegistrationsController

      def create
        super
      end

    protected

     def after_sign_in_path_for(resource)
       puts "<<<<<<<<<<<<<<<< SIGN IN"
       after_register_path(:import_contacts)
     end

     def after_sign_up_path_for(resource)
       puts "<<<<<<<<<<<<<<<< SIGN UP ACTIVE"
     after_register_path(:import_contacts)
   end

   def after_inactive_sign_up_path_for(resource)
    puts "<<<<<<<<<<<<<<<< SIGN IN INACTIVE"
    after_register_path(:import_contacts)
   end
 end

然后,我创建了一个新的控制器来处理向导的步骤。

代码语言:javascript
复制
   class AfterRegisterController < ApplicationController
     include Wicked::Wizard
     before_filter :authenticate_user!

     steps :import_contacts, :select_agents, :wish_form

     def show
       @user = current_user
       render_wizard
     end

     def update
       @user = current_user
       @user.attributes = params[:user]
       render_wizard @user
     end

   end

当我创建一个用户的电子邮件/密码时,向导就来了,一切都很好,但是当我尝试注册facebook时,魔法师永远不会出现。

有什么暗示吗?

谢谢你!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-15 21:58:59

如果一切都按照通常的方式配置(而且我所看到的看起来非常标准),那么登录使用Facebook就根本不会通过RegistrationsController了。它将通过您尚未发布代码的OmniauthCallbacks控制器。这取决于他们通过Facebook登录时你在里面做什么。我假设您有一个facebook()方法,它调用User.find_for_facebook_oauth(auth)。那么,你是否只是签了名而不是去RegistrationsController呢?如果是这样的话,那么RegistrationsController就不会被触及,因此它被覆盖的after_sign_in_path_for不会有任何效果。

如果您想让覆盖的after_sign_in_path_for在整个应用程序中生效,可以在ApplicationController中定义它。如果您只希望它在您的OmniauthCallbacksController中生效,您可以在那里定义它。在这两种情况下,每次使用Facebook登录时,他们都会点击它(如果你把它放到ApplicationController中,每次有人使用任何方法登录),那么您就需要跟踪他们已经通过了向导的事实,前提是您想确保只在他们第一次登录时才会这样做。如果您使用的是devise :trackable模块,也许检查user.sign_in_count是合适的,或者您有其他方法可以轻松地检查它们是否已经通过了向导。

关于评论问题的最新情况:

您的第一个问题是:“假设我将after_sign_in_path_fot放在ApplicationController中,我应该删除RegistrationsController中的after_inactive_sign_up_path_for方法,对吗?”这取决于你想要什么行为。对于RegistrationsController,就像在您的问题中一样,它将在他们注册后,在确认他们的电子邮件之前(因为在本例中将被调用的after_inactive_sign_up_path_for )转到向导那里。当他们确认并登录时,after_sign_in_path_for in ApplicationController将再次将它们发送给向导。因此,如果您只想在登录后使用向导,请从RegistrationsController中删除不活动的内容。那么,after_sign_up_path_for(resource)RegistrationsController中可能是不必要的,因为devise中的默认实现只是调用after_sign_in_path_for(resource),这是您将在ApplicationController中拥有的。无论如何,如果由于RegistrationsController.create()的默认实现中的逻辑而总是需要确认,则不会调用RegistrationsController.create()--要求确认将导致resource.active_for_authentication?返回false,从而导致调用after_inactive_sign_up_path_for(resource)

关于你第二个评论中的问题,你说“如果我删除after_sign_in_path_for in ApplicationController”--我猜你指的是RegistrationsController?如果这是正确的,那么是的,在您覆盖的RegistrationsController版本中不需要任何方法(如果这是您在问题中粘贴的整个控制器),因为您的create()只调用superafter_sign_in_path_for将在ApplicationController中,您可能不想使用上面讨论的任何一个after_(inactive)_sign_up_path_for方法。所以是的,你的RegistrationsController就不需要了。您可以完全删除它并删除:registrations => "registrations"中的routes.rb --然后将再次使用RegistrationsController的设计实现。

然后,您会说“只需重写RegistrationsController在ApplicationController中的方法?”。RegistrationsController留给您的唯一方法是ApplicationController中的after_sign_in_path_for(resource),因此我认为在ApplicationController中不会有来自RegistrationsController的任何其他方法。如果我错过了你的要求,或者做了错误的假设,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21798559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档