如何在所有请求上实现重定向(在某些条件下)?

Dan*_*per 4 ruby redirect ruby-on-rails

我想设置一些内容,以便在我的应用程序中的帐户被禁用时,我希望将所有请求重定向到"已禁用"消息.

我在我的ApplicationController中设置了它:

class ApplicationController < ActionController::Base
  before_filter :check_account

  def check_account
    redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
  end
end
Run Code Online (Sandbox Code Playgroud)

当然,如果帐户未处于活动状态,则进入无限循环时,这不会很有效.我希望使用类似的东西:

redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
Run Code Online (Sandbox Code Playgroud)

但我注意到在Rails v2.1(我正在使用的)中,@ console现在是控制器,这似乎在ApplicationController中不起作用.

实现这样的事情最好的方法是什么?

Ian*_*ell 6

你有几个选择.

如果您的操作方法"已禁用"在应用程序范围内唯一命名,则可以向before_filter调用添加例外,如下所示:

before_filter :check_account, :except => :disabled
Run Code Online (Sandbox Code Playgroud)

如果要专门检查过滤器中的控制器和操作,应注意此代码已经是控制器对象的一部分.您可以将其称为"自我",如下所示:

  def check_account
    return if self.controller_name == "main" && self.action_name == "disabled"

    redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
  end
Run Code Online (Sandbox Code Playgroud)

最后,如果您愿意,可以在MainController.rb中覆盖过滤器方法:

  def check_account
    return if action_name == "disabled"
    super
  end
Run Code Online (Sandbox Code Playgroud)