如何从javascript,my_ruby_obj.price访问发送到浏览器my_ruby_obj.to_json?

时间:2012-11-04 23:40:56

标签: javascript jquery ruby ajax json

在红宝石中:

class Obj
  attr_accessor :price
end

my_ruby_obj = Obj.new

put my_ruby_obj.to_json

"\"#<Obj:0x1c9b018>\""

服务器将my_ruby_obj.to_json发送到浏览器(sinatra,带有content_type:json)以响应jquery ajax请求(使用$ .get),该请求正确定义了json的返回类型,并启动执行以下操作的回调函数(数据):

console.log(data);

返回:

#<Obj:0x1c9b018>

现在如何在javascript / jquery 中访问“data.price”属性,就像我通常在ruby对象上访问其属性一样? ( “my_ruby_obj.price”)

我尝试使用console.log(data.price);

> Undefined

我觉得我在这里错过了一大块......我想这与json如何处理对象有关..

有任何帮助吗? 如果可能的话,我正在寻找一种正确的方法来使用jquery。

由于

修改 试图了解发生了什么,我在回调中尝试了这个:

newdata = $.parseJSON(data);

但调试控制台暂停显示:

> uncaught exception: Invalid JSON: #<Obj:0x1c9b018>

我确实在ruby对象上调用了.to_json,为什么会这么说呢? ...

[[的 new_edit:]]

似乎像自定义类中的对象的ruby json序列化不能像我想象的那样工作:

从这里引用:https://stackoverflow.com/a/4464721/988591

  

对于来自您自己的类的对象来说会有点困难。对于   下面的类,to_json会产生类似的东西   "\"#<A:0xb76e5728>\""。这可能是不可取的。有效地   将您的对象序列化为JSON,您应该创建自己的to_json   方法

示例如下...... 但是......哇......有没有更简单的方法呢?

2 个答案:

答案 0 :(得分:0)

您将通过javascript返回对象的字符串表示形式,而不是其自身的对象。

你需要返回一个JSON表示:

render json: my_ruby_obj.to_json

或者甚至更好,如果你知道你需要访问的字段:

render json: {price: my_ruby_obj.price}

答案 1 :(得分:0)

好的我找到了我想要的东西!自动快速解决方案,还带来其他方面的好处(速度更快!)。

标准json gem仅适用于某些类(Array,Hash,..),并且无法将您创建的自定义类/对象转换为JSON。它不知道如何组织数据,除非你为自己写了一个自定义的.to_json方法,这是我要避免的。

所以最后我发现了一个名为 Oj 的宝石:Optimized Json(宝石安装oj)

引用作者:

  

优化的JSON(Oj),顾名思义是为了提供速度而编写的   优化的JSON处理。它被设计为更快的替代品   Yajl和其他常见的Ruby JSON解析器。到目前为止已经实现了   大约比Yajl快2倍的时间用于解析和3次或更多次   更快写JSON

     

Oj有几种转储或序列化模式,用于控制对象如何转换为JSON。这些模式使用:mode选项设置   默认选项或dump()的选项之一   方法

     

:object 模式会将任何对象转储为带有键的JSON对象   匹配Ruby对象的变量名称而不带“@”字符。这个   是最高性能模式。

我这样使用它:

json = Oj.dump(guy, mode: :object) 但在我的情况下,它没有模式::对象也是如此。

现在console.log(data);显示:

({'^o':"Human", x:38, y:58, name:"Jack", bday:{'^t':1352083824.5625}, age:50})

既然序列化工作正常,我终于可以了:

console.log(data.age); // ---&gt; 50

序列化也更快。

..虽然已经很长时间了;)

非常感谢您访问图书馆作者:http://twitter.com/#!/peterohler