2011-10-12 57 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