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

我已经在我的 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 中不起作用。

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

有帮助吗?

解决方案

您还可以使用 skip_before_filter 对于您不希望应用过滤器的一个控制器/方法。

其他提示

您有多种选择。

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

before_filter :check_account, :except => :disabled

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

  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

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

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

如果操作!=禁用的redirect()结束

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top