我正在尝试渲染一个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_recieved
和data.bytes_expected
时未定义。
我的rails代码出了什么问题?
答案 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,此请求没有实际的有效负载。
有可能的解决方案:
更新:我还没有看到它,但是@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对象。我不知道这是否能解决问题。