2008-09-18 25 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

相關問題