2012-11-04 38 views
-3

在紅寶石:如何從javascript,my_ruby_obj.price作爲my_ruby_obj.to_json發送到瀏覽器?

class Obj 
    attr_accessor :price 
end 

my_ruby_obj = Obj.new 

提出my_ruby_obj.to_json

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

服務器發送my_ruby_obj.to_json到瀏覽器(屈,與CONTENT_TYPE:JSON)響應於一個jquery AJAX請求(與$ .get),它正確地定義了一個json的返回類型,並啓動了一個回調函數(data),它可以:

console.log(data);

返回:

#<Obj:0x1c9b018> 

現在怎樣訪問「data.price」屬性在JavaScript/jQuery的我通常會做一個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:]

好像紅寶石JSON序列化的對象從自定義類是行不通的,因爲我認爲:

從這裏報價:https://stackoverflow.com/a/4464721/988591

來自你自己班級的對象會更難一些。對於 以下類,to_json將產生類似 "\"#<A:0xb76e5728>\""。這可能是不可取的。要有效地將您的對象作爲JSON序列化,您應該創建自己的to_json 方法。

和示例如下... 但..哇...是不是有一種更簡單的方法?

+0

downvoters,護理面對你的意見在這裏你爲什麼downvoting? –

回答

0

好吧,我發現正是我一直在尋找!一種自動化的快速解決方案,它還具有其他優點(更快!)。

標準json gem僅適用於某些類(Array,Hash,..),並且無法將您創建的自定義類/對象轉換爲JSON。它不知道如何組織數據,除非你自己寫的類,這是我特林避免定製.to_json方法..

所以最終我找到了一個叫Oj的寶石: Optimized Json(創業板安裝OJ)

引用作者:

優化JSON(OJ),顧名思義是寫給提供速度 優化的JSON處理。它被設計爲Yajl和其他常見的Ruby JSON解析器的更快替代方案 。到目前爲止已經實現了 約爲2倍於Yajl解析和3倍或更多倍 更快寫入JSON

Oj有幾種轉儲或序列化模式,用於控制對象如何轉換爲JSON。這些模式通過 中的:mode選項設置,可以是默認選項,也可以作爲轉儲方法的一個選項() 方法。

:對象模式將轉儲任何對象作爲一個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); // ---> 50

序列化是也更快。

..這是一個漫長的車程,雖然;)

非常感謝你去圖書館作者:http://twitter.com/#!/peterohler

+0

順便問一下,現在我問自己,是否有一種更「標準」的方式來解決這個問題,即將對象分成小塊,然後將它們序列化,然後一塊一塊發送出去?像@邁克爾Shimmins說:my_ruby_obj.price.to_json,然後my_ruby_obj.color.to_json,然後...,和噓?好吧..足夠.. :) –

0

您正在通過javascript返回對象的字符串表示形式,而不是其對象的對象。

您需要返回JSON表示FO是:

render json: my_ruby_obj.to_json 

甚至更​​好,如果你知道的領域,你需要訪問:

render json: {price: my_ruby_obj.price} 
+0

您確定這適用於Sinatra而不適用於Rails嗎?請看以下示例http://nathanhoad.net/how-to-return-json-from-sinatra –

+1

同樣的理論將適用於您通過JSON從服務器發送到客戶端的內容。不知道在sinatra應用程序中是否有'to_json'。你只是發送一個簡單的字符串「#」 - 需要發送實際的json。 –

+0

你是對的,但它導致了一個「醜陋」的解決方案。 :\請檢查new_edit的問題。 –

相關問題