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 [重复]

设计 Ajax 404 路由错误

ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404

Rails 5 - Ajax 刷新后重新初始化 Javascript?

Ajax 响应调用,404 Not Found

Rails 4:通过ajax检查优惠券