rails json格式

时间:2011-06-10 06:46:43

标签: ruby-on-rails json jquery

我正在尝试渲染一个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代码出了什么问题?

3 个答案:

答案 0 :(得分:2)

我认为您的主要问题可能是您返回的字符串看起来像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

答案 1 :(得分:0)

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

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

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

有可能的解决方案:

  • 如果您需要从跨域加载数据,请尝试删除request.xhr?条件并使用JSONP方法和回调
  • 如果不是跨域情况,只需加载$.getJSON响应并且不要触及条件

更新:我还没有看到它,但是@Barlow指出你需要在你的rails应用程序中修复你的json代码。正如他所说。

答案 2 :(得分:0)

您可以将代码简化为:

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

因为render :json会将哈希转换为JSON对象。我不知道这是否能解决问题。