2010-10-29 31 views
1

我正在使用Ruby on Rails 2.3.8,並且希望用戶在訪問網站中的任何內容之前登錄。無法在application_controller上過濾已登錄的用戶

我已經寫在應用程序啓動時,我在瀏覽器中得到一個錯誤的application_controller

before_filter :login_required 

以下(甚至沒有從應用程序本身)說,它未能重定向的頁面。我在URL中看到http://localhost:3000/session/new,但它不起作用。

然後,我試圖將該過濾器放置在另一個控制器中,例如dashboard_controller,這是主頁,它工作正常(但它僅適用於此控制器,並且我希望它過濾整個應用程序)。

然後我就開始想,我倒認爲過濾器被用於在路由文件中創建這兩行的一個入口前執行:

map.login '/login', :controller => 'sessions', :action => 'new' 
map.signup '/signup', :controller => 'users', :action => 'new' 

任何幫助將不勝感激。

+0

一個問題是before_filter是一種方法,而不是兩種。 – TreyE 2010-10-29 19:51:15

+0

好吧,我的壞。我在帖子中寫錯了,但沒有寫在代碼中,所以這不是問題。 – 2010-10-29 19:53:32

回答

3

我假設你在重定向而不排除你不想重定向的控制器動作。也就是說,您的前過濾器正在從登錄頁面觸發。

如果是這樣,跳過的before_filter在會話控制器

skip_before_filter :login_required, :only => [:login, :create] 
+0

這工作!我現在明白了這個問題。這就像一個循環重定向,所以瀏覽器不知道如何處理它。我最終在sessions_controller上寫下了以下內容:skip_before_filter:login_required – 2010-10-29 19:57:01

+0

是的,無限重定向,瀏覽器不喜歡它們:) – tybro0103 2010-10-29 21:06:24

0

你不希望過濾每一個請求,只需要登錄的用戶的人。因此,將before_filter放置在每個需要它的控制器中,而不是在ApplicationController中。是的,這意味着會有一些重複(哦,恐怖!),但代碼的意圖會更清晰。

+0

我是rails新手,但無法創建另一個繼承自ApplicationController的基類控制器類具有before_filter代碼,然後從新的基礎控制器繼承那些需要登錄的站點區域?你可以稱之爲SecuredController或類似的東西。這會起作用嗎? – someoneinomaha 2010-10-29 20:16:51

+0

是的,你可以創建你自己的「多態」控制器類。在實踐中,我不認爲這樣做經常發生,因爲這些行爲往往是非常明顯的,以至於沒有很大的勝利。但是YMMV。在OP的情況下,它只有一行代碼被複制 - 你是否真的需要另一個類來幹掉它? – zetetic 2010-10-29 20:45:27

+0

有關多態控制器的更多信息,請訪問以下網站:http://www.pathf.com/blogs/2008/07/drying-up-rails-controllers-polymorphic-and-super-controllers/ – zetetic 2010-10-29 20:51:57