我是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 - 这是问题...
我想问你 - 你能帮忙吗?我请,哪里可能是一个问题?我做错了什么?
但是如果我将这行添加到** ApplicationController **,那么这就意味着,在每个控制器的每个动作中都会方法** check_session **检查用户是否登录,对吗? – user984621
是的,其实这就是你想要的......我猜。但是您也可以在不同的控制器中添加skip_before_filter:check_session:only => [:index,:search等..]。在这个例子中,这会跳过你的before_filter:check_session动作:索引和搜索。这样你就有了一个全局行为,它总是为登录的用户检查会话。但是你可以跳过这个特别的控制器,其中一些操作不需要用户进行认证。 – Cygnusx1
我更新了我的回复,以便更清楚。 – Cygnusx1