如何对所有请求实现重定向(在某些条件下)?
-
01-07-2019 - |
题
我想进行一些设置,以便如果我的应用程序中的帐户被禁用,我希望所有请求都重定向到“禁用”消息。
我已经在我的 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()结束
不隶属于 StackOverflow