【发布时间】: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 对象和数字。当我更改为“返回级别”时,它停止返回数字并只返回对象,这正是我想要的。你知道为什么会这样吗?
标签: jquery ruby-on-rails json ruby ajax