2008-09-18 20 views
3

我想设置一些内容,如果我的应用程序中的帐户被禁用,我希望所有请求都被重定向到“禁用”消息。如何在所有请求上实现重定向(在某些情况下)?

我在我的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的2.1版(我使用的是什么),@Controller现在控制器,这似乎并没有在ApplicationController的工作。

什么是最好的方式来实现这样的事情?

回答

3

您也可以使用skip_before_filter为您不希望过滤器适用的一个控制器/方法。

+0

我认为这可能是最简洁的方式来实现它。谢谢! – 2008-09-18 07:12:41

0

如果theres没有太多的覆盖然后只是如果重定向过滤

就把如果行动!=禁用 重定向() 结束

6

您有几种选择。如果你想专门为控制器检查

before_filter :check_account, :except => :disabled 

如果你的行动方法“已禁用”的适用范围是唯一命名的,你可以添加一个例外的before_filter呼叫,像这样和过滤器中的操作,您应该注意,此代码已经是控制器对象的一部分。你可以称其为“自我”,像这样:

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

第一次摆脱全局变量$账户如何。你基本上是通过使用全局设置自己的一些严重的错误。只需使用实例变量而不是@或更好,但在ApplicationController上创建一个名为current_account的方法,该方法访问@current_account实例变量。

+0

嘿,埃里克,谢谢你的提醒。我确信有更好的方法来做到这一点,我认为current_account方法将是一个很好的方法。干杯! – 2008-09-19 02:17:16

相关问题