我想设置一些内容,以便在我的应用中的某个帐户被禁用时,我希望将所有请求重定向到“已禁用”的消息。
我在我的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中不起作用。
实现这样的最佳方法是什么?
答案 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放在重定向过滤器
中如果操作!=禁用 重定向() 端