4

我想进行一些设置,以便如果我的应用程序中的帐户被禁用,我希望所有请求都被重定向到“禁用”消息。

我已经在我的 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(我正在使用的)中,@controller 现在是控制器,这在 ApplicationController 中似乎不起作用。

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

4

4 回答 4

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
于 2008-09-18T03:02:39.613 回答
3

您也可以将 askip_before_filter用于您不想应用过滤器的一个控制器/方法。

于 2008-09-18T04:56:33.380 回答
1

首先摆脱那个全局变量 $account 怎么样?通过使用全局变量,您基本上是在为一些严重的错误做好准备。只需使用实例变量而不是 @ 或者更好的是在 ApplicationController 上创建一个名为 current_account 的方法,该方法访问 @current_account 实例变量。

于 2008-09-18T19:07:47.967 回答
0

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

if action != disabled redirect() end

于 2008-09-18T03:01:21.800 回答