Rails 3.2.1 redirect_to在使用AJAX时不呈现页面

时间:2012-06-14 10:32:59

标签: jquery ruby-on-rails-3.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控制器方法的顶部放置一个重定向,这也存在同样的问题。 我的理论是远程:真的是原因,但我不知道该怎么做才能修复它。任何人都可以帮忙吗?

2 个答案:

答案 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是否为会话是否已过期。