0

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

在用户.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

    ...

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

在路线.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

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

   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 注册时,向导永远不会出现。

有什么提示???

谢谢!!

4

1 回答 1

1

如果一切都以通常的方式配置(并且我所看到的看起来很标准),那么使用 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_forApplicationController再次将他们发送给向导。RegistrationsController所以是的,如果您在登录后只需要向导,请删除非活动状态。那么可能after_sign_up_path_for(resource)inRegistrationsController是不必要的,因为设计中的默认实现只是调用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()只是调用super,并且您after_sign_in_path_for可能ApplicationController不想要任何一种after_(inactive)_sign_up_path_for方法如上所述。所以是的,不需要你的RegistrationsController. 您可以完全删除它并删除:registrations => "registrations"routes.rb -RegistrationsController然后将再次使用设计实现。

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

于 2014-02-15T21:58:59.050 回答