Before_action导致重定向过多

时间:2018-10-29 18:30:35

标签: ruby-on-rails ruby ruby-on-rails-5

我想知道什么是处理以下问题的最佳方法:

我有一种身份验证方法(用作before_action),如下所示,该方法用于在请求登录页面时检查user_id是否在会话中。如果检测到user_id,则它将用户重定向到仪表板路径。

def already_validated
    if session[:uid] == user.id
        redirect_to dash_path
    end
end

这导致太多重定向错误,据我了解。我可以窥见到它只是在每次页面加载时评估before_action过滤器。这就是导致过多重定向的原因。

我的问题是处理此类设置的最佳方法是什么。有没有办法只在第一次重定向上评估?我想到了使用temp标志来判断重定向是否之前发生过。不过,这似乎并不十分优雅。我敢肯定有一种更容易/更好的方式来管理它。

感谢您提供的任何建议。

2 个答案:

答案 0 :(得分:1)

您只需告诉Rails跳过处理dash_path的控制器中的before过滤器即可:

# in the controller
skip_before_action :already_validated

了解Filters in the Rails Guides

答案 1 :(得分:1)

before_action上肯定有一个例外:您不想在dash_path上调用它。如果用户进入那里并通过验证,则应停留在该位置(如redirect所做的那样),如果用户未通过验证,则应停留在该位置(与其他未通过验证过程的其他网址一样)。

检查结果是否经过验证毫无用处,因为结果始终会停留在同一页面上。

然后,您必须在控制器中指定要在before_action上例外:

class SomeController < ApplicationController
  before_action: :already_validated, except: [:dash_action]

  def is_validated_action # the method that causes the redirect
  end 

  def dash_action # action of dash_path url
  end

  def already_validated
    if session[:uid] == user.id
        redirect_to dash_path
    end
  end
end

如果您想进行假设的before dash_action验证,请为其创建一个新方法。确保没有循环引用,否则从长远来看将很难调试。