退出设计的重定向路径

时间:2014-11-08 07:02:26

标签: ruby-on-rails devise

我已经覆盖了Devise的注销路径,并将其作为request.referer。问题是,如果用户位于具有authenticate_user的页面上!在应用过滤器之前,我被发送到登录页面并显示错误。这并不理想,我想仅在用户来自具有身份验证要求的路径时才重定向到root_path。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

我最终检查了与引荐来源网址相关联的控制器的回调。如果有任何authenticate_*!回调,则会检查每个回调以查看@if实例变量中是否指定了任何操作。如果没有,则回调应用于所有操作,并且我们知道引用URL来自受限制的操作。如果指定了操作,我们使用正则表达式来检查引用操作是否受到限制。

符合条件的任何回调都会添加到数组中。循环回调后,我们检查该数组是否为空。如果是,我们会将用户发回request.referer。如果它不为空,则表示将其发送到request.referer会将其重定向到登录页面并显示错误。在这种情况下,我们会将用户发送到root_path

如果有任何错误,则会将用户发送到root_path

以下是代码:

def after_sign_out_path_for(resource_or_scope)
  begin
    controller_name = Rails.application.routes.recognize_path(request.referer)[:controller]
    controller_class = "#{controller_name}_controller".camelize.constantize
    authentication_callbacks = controller_class._process_action_callbacks.select { |callback| callback.filter.match /authenticate_\w+!/ }
    action_name = Rails.application.routes.recognize_path(request.referer)[:action]

    restricting_callbacks = []

    authentication_callbacks.each do |callback|
      callback_scope = callback.instance_variable_get(:@if)
      if callback_scope.empty? || callback_scope.first.match(/action_name\s==\s(\'|\")#{Regexp.quote(action_name)}(\'|\")/)
        restricting_callbacks << callback
      end
    end

    restricting_callbacks.empty? ? request.referer : root_path
  rescue Exception => e
    request.referer
  end
end