道歉,如果这是一个非常愚蠢的问题,或者我做了一些非常愚蠢的事情,我仍然是新手。 我正在尝试实现一个会话超时机制,我在SO中找到了一些有用的问题/答案,我已经遵循了。我添加了一个last_seen时间作为会话变量,我在应用程序控制器的before_filter中检查它,如果超过设置的间隔,则将用户发送回登录页面。
应用程序控制器
reset_session if session[:last_seen] < 1.minutes.ago
if session[:user_id] == nil
redirect_to login_path, notice: "Please log in"
return
end
session[:last_seen] = Time.now
这在大多数页面上都可以正常工作,但我有一些标签页面,使用jquery在选择标签时使用部分更改内容。
链接代码:
<li class="<%=get_active('index_audit','ultra')%>"><%= link_to 'Load IT Estate', ultraaudit_path, remote: true %> </li>
控制器代码:
def index_audit
@subscription = current_subscription
respond_to do |format|
format.js
end
end
有一个index_audt.js,它有JS用一个渲染的部分替换div
如果发生超时并且下一个操作是单击选项卡以呈现下一页,则会通过代码但不会在浏览器中显示登录页面
我在RubyMine中调试,控制台显示它试图呈现登录页面,即会话/新:
Processing by UltraController#index_audit as JS
Parameters: {"locale"=>"en-GB"}
Redirected to http://localhost:3000/?locale=en-GB
Filter chain halted as :logged_in rendered or redirected
Completed 302 Found in 6ms (ActiveRecord: 0.0ms)
Started GET "/?locale=en-GB" for 127.0.0.1 at 2012-06-14 11:28:44 +0100
Processing by SessionsController#new as JS
Parameters: {"locale"=>"en-GB"}
Rendered sessions/new.html.erb within layouts/application (16.0ms)
Completed 200 OK in 323ms (Views: 320.6ms | ActiveRecord: 0.0ms)
但它只是没有出现在浏览器中
我已经尝试在index_audit控制器方法的顶部放置一个重定向,这也存在同样的问题。 我的理论是远程:真的是原因,但我不知道该怎么做才能修复它。任何人都可以帮忙吗?
答案 0 :(得分:1)
对于遇到此问题的任何人(正如我在将rails 3.0升级到3.1后所做的那样),建议的修复程序不起作用或与您自己的修复程序不同。
从form_for标记中删除:remote => true
,允许提交和重定向通过。这是有道理的,因为最后一个表单没有使用ajax来获得响应。
希望这有助于其他人!
答案 1 :(得分:0)
如果用户的会话仍然有效,index_audit
操作将返回JS,但如果用户的会话过期,它将返回登录页面的HTML。据推测,您的远程处理程序期望JS格式,因此它不会看到它可以对包含登录页面的HTML响应做任何事情。
最好的方法可能是向format.js
添加SessionsController.new
选项,并创建必要的new.js.erb
视图,这样如果您请求javascript格式,则始终获取javascript是否为会话是否已过期。