2011-10-12 55 views
2

我是Rails的新手。我嘗試建立一個簡單的身份驗證系統,以application_controller我把下面幾行:Rails 3 - 驗證和:before_filter

def check_session 
    if session[:user] 
     if session[:expiry_time] < 10.minutes.ago 
     reset_session 
     flash[:warning] = 'You was logout.' 
     redirect_to root_url 
     else 
     session[:expiry_time] = Time.now 
     end 
    else 
     #... authenticate 
     session[:expiry_time] = Time.now 
     flash[:warning] = 'You was logout.' 
     redirect_to root_url 
    end 
    end 

我的問題是在一個動作 - 這個動作我檢查,如果用戶登錄或沒有。如果用戶登錄,那麼我將渲染一個模板,如果沒有,我將渲染第二個模板。它看起來像:

<% unless session[:user].nil? %> 
    <%= render :template => 'template_for_login_user' %> 
<% else %> 
    <%= render :template => 'template_for_not_login_user' %> 
<% end %> 

而這裏是問題 - 這並不適用於我。至少...好吧 - 如果我沒有登錄,那麼將渲染模板template_for_not_login_user,如果我是,那麼template_for_login_user。這是對的。

但是,如果我登錄,我在template_for_login_user,但我15分鐘空閒=>會話將過期=>我應該重定向到登錄窗體。但這裏是問題 - 我15分鐘空閒,我刷新此頁面,所以我仍然在動作template_for_login_user - 這是問題...

我想問你 - 你能幫忙嗎?我請,哪裏可能是一個問題?我做錯了什麼?

回答

5

在你的ApplicationController,你有沒有添加這樣一行:

before_filter :check_session 

如果某些控制器的動作並不需要用戶進行身份驗證,可以補充一點:

skip_before_filter :check_session, :only=> [:index, :search, etc..] 

在這個例子中,這會跳過你的before_filter:check_session動作:索引和搜索。這樣你就有了一個全局行爲,它總是爲登錄的用戶檢查會話。但是你可以跳過這個特別的控制器,其中一些動作不需要用戶進行認證

+0

但是如果我將這行添加到** ApplicationController **,那麼這就意味着,在每個控制器的每個動作中都會方法** check_session **檢查用戶是否登錄,對嗎? – user984621

+0

是的,其實這就是你想要的......我猜。但是您也可以在不同的控制器中添加skip_before_filter:check_session:only => [:index,:search等..]。在這個例子中,這會跳過你的before_filter:check_session動作:索引和搜索。這樣你就有了一個全局行爲,它總是爲登錄的用戶檢查會話。但是你可以跳過這個特別的控制器,其中一些操作不需要用戶進行認證。 – Cygnusx1

+0

我更新了我的回覆,以便更清楚。 – Cygnusx1