Ruby on rails 在Rails应用程序中重新加载静态HTML页面时出现奇怪的超时
我在Rails应用程序的公用文件夹中有一个小的静态HTML页面。此页面对输入键执行AJAX请求。一切都很好,除了当我重新加载页面时,rails被卡住了几秒钟,浏览器不得不等待。最后,Rails记录请求超时,brrowser加载页面。页面上没有onload处理程序,因此任何Rails控制器中的延迟都不会使浏览器等待。延误的原因可能是什么 以下是本页的代码:Ruby on rails 在Rails应用程序中重新加载静态HTML页面时出现奇怪的超时,ruby-on-rails,timeout,delay,static-html,Ruby On Rails,Timeout,Delay,Static Html,我在Rails应用程序的公用文件夹中有一个小的静态HTML页面。此页面对输入键执行AJAX请求。一切都很好,除了当我重新加载页面时,rails被卡住了几秒钟,浏览器不得不等待。最后,Rails记录请求超时,brrowser加载页面。页面上没有onload处理程序,因此任何Rails控制器中的延迟都不会使浏览器等待。延误的原因可能是什么 以下是本页的代码: <!DOCTYPE html> <html> <head> <title>Prompt
<!DOCTYPE html>
<html>
<head>
<title>Prompt test</title>
<script src="/assets/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#searchbox").keyup(function(){
if ($("#searchbox").val().length<2) {
$('#autocomplete').hide();
return;
}
$.ajax(
{
type: "POST",
url: "/prompts",
data: {
request_str: $("#searchbox").val()
},
success: function(data) {
$('#autocomplete').find('option').remove();
$('#autocomplete').attr('size', data.length);
console.log(data);
if (data.length==0) $('#autocomplete').hide(); else $('#autocomplete').show();
for (var i=0; i<data.length; i++) {
$('#autocomplete').append($("<option></option>")
.attr("value", data[i])
.text(data[i]));
}
},
error: function(){
$('#autocomplete').find('option').remove();
$('#autocomplete').hide();
}
}
);
});
});
</script>
<style type="text/css">
#autocomplete{
position: absolute;
background: transparent;
z-index: 10;
width: 200px;
display: none;
}
</style>
</head>
<body>
<input type="text" id="searchbox" /><br>
<select id="autocomplete" size="10" multiple="multiple">
</select>
</body>
</html>
这是控制器:
require 'uri'
require 'net/http'
require 'json'
class PromptsController < ApplicationController
skip_before_action :verify_authenticity_token
def get_data
uri = URI.parse("http://192.168.0.200:12345/prompts")
data = {
count: 10,
text: params[:request_str],
}
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, { 'Content-Type' => 'text/json' })
request.body = data.to_json
response = http.request(request)
if response.code=='200'
results = JSON.parse(response.body)['results']
render :json => results.map { |res| res['text'] }
else
render :json => { error: response.code }
end
end
end
可能是Turbolinks有问题-如果您硬刷新,按刷新按钮是否有效 若要查看这是否是TurboLink问题,为什么不尝试以下方法:
test_turbolinks = function() {
$(documnt).on("keyup", "#searchbox", function(){
if ($("#searchbox").val().length<2) {
$('#autocomplete').hide();
return;
}
$.ajax(
{
type: "POST",
url: "/prompts",
data: {
request_str: $("#searchbox").val()
},
success: function(data) {
$('#autocomplete').find('option').remove();
$('#autocomplete').attr('size', data.length);
console.log(data);
if (data.length==0) $('#autocomplete').hide(); else $('#autocomplete').show();
for (var i=0; i<data.length; i++) {
$('#autocomplete').append($("<option></option>")
.attr("value", data[i])
.text(data[i]));
}
},
error: function(){
$('#autocomplete').find('option').remove();
$('#autocomplete').hide();
}
}
);
});
});
$(document).on("page:load ready", test_turbolinks);
当我用HTTPClient替换Net::HTTP时,所有的延迟都神奇地消失了。它多次调用同一个Ajax请求吗?只需在浏览器日志中查看即可。
Started POST "/prompts" for 127.0.0.1 at 2014-04-02 14:19:58 +0400
Processing by PromptsController#get_data as */*
Parameters: {"request_str"=>"gh"}
Completed 500 Internal Server Error in 60009ms
Net::ReadTimeout (Net::ReadTimeout):
app/controllers/prompts_controller.rb:23:in `get_data'
test_turbolinks = function() {
$(documnt).on("keyup", "#searchbox", function(){
if ($("#searchbox").val().length<2) {
$('#autocomplete').hide();
return;
}
$.ajax(
{
type: "POST",
url: "/prompts",
data: {
request_str: $("#searchbox").val()
},
success: function(data) {
$('#autocomplete').find('option').remove();
$('#autocomplete').attr('size', data.length);
console.log(data);
if (data.length==0) $('#autocomplete').hide(); else $('#autocomplete').show();
for (var i=0; i<data.length; i++) {
$('#autocomplete').append($("<option></option>")
.attr("value", data[i])
.text(data[i]));
}
},
error: function(){
$('#autocomplete').find('option').remove();
$('#autocomplete').hide();
}
}
);
});
});
$(document).on("page:load ready", test_turbolinks);