所有
我有一个视图,onload,执行一些JQuery代码来填充select_tag框:
var request = $.get("getLocalSuites");
getLocalSuites路由到控制器中的以下函数:
def getLocal
myPass = sessionPass
if (myPass != nil)
puts "4"
result = @@p4object.getLocalSuites(sessionUser,myPass)
render :json => result
end
end
定义了sessionPass和sessionUser函数:
def sessionUser()
myConnectedUser = ConnectedUser.find_by username: cookies[:username]
return myConnectedUser[:username]
end
def sessionPass()
begin
myConnectedUser = ConnectedUser.find_by username: cookies[:username]
puts "1"
verifier = ActiveSupport::MessageVerifier.new(cookies[:session])
puts "2"
mysession = verifier.verify(myConnectedUser[:password])
rescue ActiveSupport::MessageVerifier::InvalidSignature
puts "3"
redirect_to sign_in_session_expired_url
end
puts mysession
return mysession
end
换句话说 - 我的jQuery调用getLocal,它找到存储在数据库中的用户名和密码。然后,它会根据会话cookie验证返回的加密密码。如果此验证失败,则应重定向回登录页面,而不是尝试继续呈现当前页面。
服务器日志正确显示Redirected to http://localhost:3000/sign_in_session_expired
...但是,而不是看到登录屏幕,&#34;原始&#34;渲染视图(使用select_tag等) - 使用某种HTML填充LocalSuites select_tag - 每个字符作为新行:<!DOCTYPE html> <html etc etc
任何人都可以解释我在这里误解的原因 - 为什么我的重定向似乎有效(根据服务器日志) - 但实际上并没有发生?
谢谢!
答案 0 :(得分:1)
浏览器不会自动重定向,因为重定向是在AJAX
来电中接收的,而不是常规浏览器GET
,因此浏览器无法处理redirects
。
请参阅此问题:How to manage a redirect request after a jQuery Ajax call
我遇到了类似的问题。我执行一个有2的ajax请求 可能的响应:将浏览器重定向到新页面的响应 一个用新的替换当前页面上的现有HTML表单 一。执行此操作的jquery代码如下所示:
$.ajax({ type: "POST", url: reqUrl, data: reqBody, dataType: "json", success: function(data, textStatus) { if (data.redirect) { // data.redirect contains the string URL to redirect to window.location.href = data.redirect; } else { // data.form contains the HTML for the replacement form $("#myform").replaceWith(data.form); } } });
JSON对象&#34;数据&#34;在服务器上构建有2个成员: data.redirect和data.form。我发现这种方法要好得多。