1

抱歉,如果这是一个非常愚蠢的问题,或者我做了一些非常愚蠢的事情,我还是个新手。我正在尝试实现会话超时机制,并且为此在 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 控制器方法的顶部放置一个重定向,这也有同样的问题。我的理论是远程:真实是原因,但我不知道该怎么做才能解决它。有人可以帮忙吗?

4

2 回答 2

1

对于遇到此问题的任何人(就像我在将 rails 3.0 升级到 3.1 后所做的那样),建议的修复不起作用或与您自己的不同。

从 form_for 标记中删除:remote => true允许提交和重定向通过。这是有道理的,因为最后一个表单没有使用 ajax 来获得响应。

希望这对其他人有帮助!

于 2012-11-17T02:13:42.177 回答
0

如果用户的会话仍然有效,则该index_audit操作将返回 JS,但如果用户的会话过期,它将返回登录页面的 HTML。据推测,您的远程处理程序需要 JS 格式,因此它看不到它可以对包含登录页面的 HTML 响应做任何事情。

最好的方法可能是添加一个format.js选项SessionsController.new,并创建必要的new.js.erb视图,这样如果您请求 javascript 格式,无论会话是否过期,您总是会得到 javascript。

于 2012-06-14T12:29:27.080 回答