如何在after_sign_in_path_for和after_inactive_sign_up_path_for方法中使用before_action?

时间:2016-05-10 21:15:56

标签: ruby-on-rails ruby model-view-controller devise before-filter

我想使用after_sign_in_path_forafter_inactive_sign_up_path_for方法将用户重定向到某个特定页面,我会将这两个方法和before_action :authenticate_user!全部放在应用程序控制器中,但是,当before_action方法运行它将在所有操作上调用,这会将我的应用程序重定向到错误的路由。我应该使用before_action :authenticate_user!, except: [:after_sign_in_path_for, :after_inactive_sign_up_path_for]来跳过这两种方法的身份验证吗?

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :authenticate!


  def after_sign_in_path_for(user)
      if user && user.is_a?(Vendor)
          return edit_vendor_registration_path
          elsif user && user.is_a?(Customer)
          return dashboard_path
      end
  end

  def after_sign_out_path_for(user)
      if user && user.is_a?(Vendor)
          return root_path
          elsif user && user.is_a?(Customer)
          return root_path
      end
  end


  def authenticate!
      if @current_user == current_customer
          :authenticate_customer!
          elsif @current_user == current_vendor
          :authenticate_vendor!
      end
  end
end

我遇到了这个错误Filter chain halted as :require_no_authentication rendered or redirected,我相信程序以某种方式创建了一个无限循环,可以重定向到dashboard_path。

1 个答案:

答案 0 :(得分:0)

我认为你混淆了一些事情。

before_action :authenticate_user!用于您希望用户进行身份验证的每个控制器操作,以便他可以继续请求。

e.g。 after_sign_in_path_for是一个设计控制器的方法,可以像这样重写:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-up-%28registration%29