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

时间:2008-09-18 02:42:09

标签: ruby-on-rails ruby redirect

我想设置一些内容,以便在我的应用中的某个帐户被禁用时,我希望将所有请求重定向到“已禁用”的消息。

我在我的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

当然,如果帐户未处于活动状态,这将无法正常工作,因为它会进入无限循环。我希望使用类似的东西:

redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"

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

实现这样的最佳方法是什么?

4 个答案:

答案 0 :(得分:6)

您有几种选择。

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

before_filter :check_account, :except => :disabled

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

  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

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

  def check_account
    return if action_name == "disabled"
    super
  end

答案 1 :(得分:3)

您还可以使用skip_before_filter作为您不希望过滤器适用的一个控制器/方法。

答案 2 :(得分:1)

如何首先摆脱全局变量$ account。你基本上是通过使用全局来为自己设置一些严重的错误。只需使用实例变量@或者更好的是在ApplicationController上创建一个名为current_account的方法,该方法访问@current_account实例变量。

答案 3 :(得分:0)

如果没有太多覆盖,那么只需将if放在重定向过滤器

如果操作!=禁用   重定向() 端