Rails ajax 调用同时产生 404 和 500 错误
Posted
技术标签:
【中文标题】Rails ajax 调用同时产生 404 和 500 错误【英文标题】:Rails ajax calls generate 404 and 500 errors when together 【发布时间】:2017-10-16 01:59:21 【问题描述】:我有两个动作,每个动作都在不同的控制器中,它们返回 json 数据。其中一项操作用于生成数据以绘制 chartkick.js 图表。每 5 秒需要调用一次这些操作来更新图表和某些 div 上显示的数据。 我执行这些操作的路线是:
routes.rb
get "/get_all_tanks_graph", to: "charts#get_all_tanks_graph", as: "get_all_tanks_graph"
get "/render_all_current_levels", to: "static#render_all_current_levels", as: "render_all_current_levels"
在视图中使用的 javascript 文件 (static/index.html) 上,我正在执行如下操作来渲染图形和来自数据库的一些 div 的内容:
assets/static.js
$(document).ready(function()
getLevels();
getGraph();
setInterval(
function()
getLevels();
updateGraph();
,
5000
);
);
function getLevels()
$.ajax(
type: "GET",
url: "/render_all_current_levels",
dataType: "json",
success: function(response)
...
);
function getGraph()
$.ajax(
type: "GET",
url: "/get_all_tanks_graph",
dataType: "json",
success: function(response)
$chart = new Chartkick.LineChart("graph-display", response);
);
function updateGraph()
$.ajax(
type: "GET",
url: "/get_all_tanks_graph",
dataType: "json",
success: function(response)
$chart = Chartkick.charts["graph-display"];
$chart.updateData(response);
);
我需要这些动作一起发生。但是通过这种方式,我在控制台上得到了这个,并且在 ajax 调用中每 5 秒发生一次:
如果我只调用 getLevels() 来获取 div 内容,然后像这样保持更新,
$(document).ready(function()
getLevels();
setInterval(
function()
getLevels();
,
5000
);
);
或者如果我只是渲染图表并保持更新,就像这样,
$(document).ready(function()
getGraph();
setInterval(
function()
updateGraph();
,
5000
);
);
他们完美地工作。所以我可以单独调用它们,但不能在 $(document).ready 中一起使用它们。为什么会这样?
控制器代码是:
def get_all_tanks_graph
@hash =
@array = Array.new
@levels = Level.get_all_tanks_levels
@levels.each do |l|
l.each do |i|
@hash[i.created_at] = i.level
end
@array << @hash
@hash = Hash.new
end
render json: @array.each_with_index.map
|a, index|
name: "Caixa #index + 1", data: a
end
def render_all_current_levels
@levels = Array.new
array = Level.get_all_current_levels
array.each do |level|
@levels << Level.find(level) if level
end
render json: @levels
end
服务器日志显示连续调用操作时的以下内容:
NoMethodError (undefined method `each' for 15:Fixnum):
Completed 500 Internal Server Error in 11ms (ActiveRecord: 4.7ms)
NoMethodError (undefined method `each' for 15:Fixnum):
app/controllers/charts_controller.rb:9:in `block in get_all_tanks_graph'
app/controllers/charts_controller.rb:8:in `each'
app/controllers/charts_controller.rb:8:in `get_all_tanks_graph'
Completed 404 Not Found in 51ms (ActiveRecord: 44.1ms)
ActiveRecord::RecordNotFound (Couldn't find Level with 'id'=#<Level::ActiveRecord_Relation:0x007f9f36429ca8>):
app/controllers/static_controller.rb:21:in `block in render_all_current_levels'
app/controllers/static_controller.rb:20:in `each'
app/controllers/static_controller.rb:20:in `render_all_current_levels'
【问题讨论】:
500 和 404 是服务器生成的状态。您的服务器日志中有什么内容? @Puhlze,我用服务器日志信息编辑了这个问题。这很奇怪..因为当没有一起调用动作时它不会发生。 你能发布这些控制器的服务器代码吗? @Puhlze 我使用控制器代码进行了编辑。 @Puhlze,我想我已经修复了,但我不知道具体原因。当我查询我的模型时,我使用的是“return @levels”,所以我返回的是 de 对象和数字。当我更改为“返回级别”时,它停止返回数字并只返回对象,这正是我想要的。你知道为什么会这样吗? 【参考方案1】:嗯,答案是,出于某种原因,通过 ajax 调用操作包括 JSON 上的 id。在模型中,我使用“@levels”作为回报而不是“级别”。当我只使用“关卡”时,它起作用了。
【讨论】:
以上是关于Rails ajax 调用同时产生 404 和 500 错误的主要内容,如果未能解决你的问题,请参考以下文章
phonegap 5.2 ajax 调用最近抛出 404 [重复]
ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404