如何在某些条件下对所有请求实施重定向?
时间:2020-03-06 14:19:46 来源:igfitidea点击:
我想进行一些设置,以便如果我的应用程序中的帐户被禁用,我希望所有请求都重定向到"已禁用"消息。
我已经在我的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中不起作用。
实现这样的最佳方法是什么?
解决方案
如果没有太多替代,则只需将if放入重定向过滤器
如果动作!=禁用
redirect()
结尾
我们有几种选择。
如果操作方法" disabled"在应用程序范围内是唯一命名的,则可以向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中覆盖filter方法:
def check_account return if action_name == "disabled" super end
我们也可以对不想应用过滤器的一种控制器/方法使用" skip_before_filter"。
首先摆脱该全局变量$ account怎么样。我们基本上是通过使用全局方法来设置一些严重错误的。只需使用实例变量代替@或者更好地在ApplicationController上创建一个名为current_account的方法即可访问@current_account实例变量。