【问题标题】:rails json format轨道json格式
【发布时间】:2011-06-10 06:46:42
【问题描述】:

我正在尝试呈现一个 json 字符串以响应如下请求:

def check_progress
  if request.xhr?
    render :json=>"{'bytes_expected': #{session[:size]}, 'bytes_recieved': #{session[:size]}, 'last_seq': 0}".to_json
  end
end

但在我的 js 代码中:

$.getScript('contacts/check_progress', function(data){
    console.log(data.bytes_recieved)
    console.log(data.bytes_expected)
    d.renderProgress(data);
});

我在回复data.bytes_recieveddata.bytes_expected 时得到未定义。

我的 Rails 代码有什么问题?

【问题讨论】:

    标签: ruby-on-rails json jquery


    【解决方案1】:

    我认为您的主要问题可能是您返回的字符串看起来像 json,实际上不是 json 哈希。

    在您的渲染语句中,您将 json 手动格式化为字符串...在您调用 to_json 之前这很好。

    to_json 应该被传递一个散列而不是一个字符串。

    您可以尝试在渲染语句末尾删除 .to_json:

    render :json=>"{'bytes_expected': #{session[:size]}, 'bytes_recieved': #{session[:size]}, 'last_seq': 0}"
    

    或创建一个 ruby​​ 哈希然后将其转换为 json:

    @ruby_hash = {
      :bytes_expected => session[:size],
      :bytes_recieved => session[:size],
      :last_seq => 0
    }
    
    render :json=> @ruby_hash.to_json
    

    【讨论】:

      【解决方案2】:

      jQuery 的$.getScript 方法将<script> 节点插入到HTML 文档的<head>

      使用该方法,您的浏览器不会将X-Requested-With HTTP 标头发送到服务器。因为这将是一个简单的 HTTP 请求,而不是 AJAX 请求。您的浏览器正在等待响应中的 javascript 而不是 JSON 数据。

      $.getScript方法的jQuery文档中有些误导,因为它在方法签名的回调函数中说data,但它不会在回调函数中给你任何数据,因为你的浏览器只是执行javascript 这个请求没有实际的有效负载。

      有可能的解决方案:

      • 如果需要跨域加载数据,请尝试去掉request.xhr?条件,使用JSONP方法和回调
      • 如果不是跨域情况,只需使用$.getJSON 响应加载,不要触碰条件

      更新:我还没有看到它,但@Barlow 指出你需要按照他的说法在你的 Rails 应用程序中修复你的 json 生成代码。

      【讨论】:

        【解决方案3】:

        您可以将代码简化为:

        def check_progress
          if request.xhr?
            render :json => {'bytes_expected' => session[:size], 
                             'bytes_recieved' => session[:size], 
                             'last_seq' => 0}
          end
        end
        

        render :json 将为您将哈希转换为 JSON 对象。不知道这样能不能解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多