我是Rails的新手。我尝试构建一个简单的身份验证系统, application_controller 我将以下几行:
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分钟闲置=&gt;会话将过期=&gt;我应该重定向到登录表单。但问题出在这里 - 我闲置了15分钟,我刷新了这个页面,所以我仍然在行动 template_for_login_user - 这就是问题......
我想问你 - 请你帮帮我,哪里可能有问题?我做错了什么?
答案 0 :(得分:5)
在ApplicationController中,您是否添加了这样的行:
before_filter :check_session
如果某些控制器操作不需要对用户进行身份验证,则可以添加以下内容:
skip_before_filter :check_session, :only=> [:index, :search, etc..]
在这个例子中,这将跳过你的before_filter:check_session on action:index和search。这样,您将拥有一个全局行为,始终检查登录用户的会话。但是您可以在特定控制器中跳过此操作,其中某些操作不需要用户进行身份验证