2014-02-15 58 views
0

我正在开发使用这三种宝石,我在这篇文章的标题写了一份申请。我使用可确认模块(?)设置了设计,所以当用户使用其电子邮件/密码创建帐户时,它会收到确认电子邮件。如果用户使用Facebook注册(使用omniauth-facebook gem),则设计跳过确认步骤。整合妖兽,设计和Omniauth Facebook的

在user.rb

"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中

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覆盖色器件的配准方法

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 

然后,我创建了一个新的控制器来处理的步骤邪恶的巫师。

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 

当我创建一个用户rith电子邮件/密码,精灵来了,一切正常,但是当我试图与Facebook注册后,wizars永远不会到来。

任何暗示???

谢谢!

+0

你能告诉我你是如何使用render_wizard – inquisitive

回答

1

如果一切都按通常的方式配置(和我所看到小艾标准),然后使用Facebook不会通过RegistrationsController走在所有签约。它将通过您尚未发布代码的控制器OmniauthCallbacks。这取决于你通过Facebook登录时在那里做什么。我假设你有一个调用User.find_for_facebook_oauth(auth)facebook()方法。那么你是在签署他们而不是去RegistrationsController?如果是这样,那么RegistrationsController将不会被触及,因此其覆盖的after_sign_in_path_for不会有任何影响。

如果你想让你的覆盖的after_sign_in_path_for在你的应用中生效,你可以在你的ApplicationController中定义它。如果你只想让它在你的OmniauthCallbacksController中生效,你可以在那里定义它。无论哪种情况,他们在每次使用Facebook登录时都会触及它(如果您将其置于ApplicationController中,则每当有人使用任何方法登录时),因此您需要跟踪他们的事实已经通过了向导,假设你想确保它只在第一次登录时发生。如果你使用的是devise:trackable模块,可能检查user.sign_in_count是合适的,或者你可能有一些以其他方式轻松检查他们是否已经通过向导。

更新COMMENT问题:

你的第一个问题:“假如我把在ApplicationController中的after_sign_in_path_fot,我应该删除RegistrationsController的after_inactive_sign_up_path_for方法,对”这取决于你想要的行为。随着RegistrationsController在你的问题它会去精灵,他们已经签署了之后,他们已经证实了他们的电子邮件之前(因为after_inactive_sign_up_path_for将在这种情况下被调用)。当他们确认并登录后,after_sign_in_path_forApplicationController将再次将它们发送给向导。所以是的,如果你只是在登录后想要向导,从RegistrationsController删除不活动。那么在RegistrationsController中可能不需要after_sign_up_path_for(resource)是不必要的,因为设计中的默认实现仅调用after_sign_in_path_for(resource),您将在ApplicationController中使用该默认实现。无论如何,after_sign_up_path_for()将不会被调用,如果您总是需要确认,因为RegistrationsController.create()的默认实现中的逻辑 - 要求确认将导致resource.active_for_authentication?返回false导致after_inactive_sign_up_path_for(resource)被调用。

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

然后你说“只需重写ApplicationController中的RegistrationsController的方法?”。您的RegistrationsController中剩下的唯一方法是after_sign_in_path_for(resource)ApplicationController,所以我认为您的RegistrationsController将不会有任何其他方法,您需要在ApplicationController。如果我错过了您的一项要求或做出了错误的假设,请告诉我。

+0

编写你的视图文件谢谢你的答案!是的,我发现RegistrationsController与facebook登录无关。我找到了一个解决方案,但它看起来比你的更肮脏(你的绝对更好)。 我在用户模型中使用了一个新字段作为标志(它与sign_up_count完全相同),然后在OmniauthCallbacks的Facebook方法中调用@ user.update_attribute(:flag,true)。 假设我把after_sign_in_path_fot放在ApplicationController中,我应该删除RegistrationsController中的after_inactive_sign_up_path_for方法,对吧?谢谢! –

+0

另一个问题。如果我在ApplicationController中删除after_sign_in_path_for,它将不会有任何方法。那么routes.rb中会发生什么:registrations =>“registrations”?我是否也必须删除它,只需重写ApplicationController中的RegistrationsController的方法? 再次感谢! –

+0

编辑答案以包含问题的答案。对不起现在有点长了! – Tim