2010-07-28 29 views
0

這裏有一個簡單的ActiveResource類。它有一些實例變量,甚至可能有一些方法,但它沒有任何數據支持。如何用這個Ruby類產生一些簡單的json?

ruby-1.8.7-p299 > class Box < ActiveResource::Base; 
        attr_accessor :a, :b, :c, :d; 
        end 
=> nil 

讓我們來填充它:

ruby-1.8.7-p299 > bx = Box.new; bx.a = 100; bx.b = 200; 
           bx.c = 300; bx.d = 400; 
           bx 
=> #<Box:0xb5841c54 @attributes={}, @b=200, @a=100, 
     @prefix_options={}, @c=300, @d=400> 

到目前爲止好。我們如何挑選其JSON模型的一些實例變量?假設我們只關心bc,但不關注ad或其他任何內容。

ruby-1.8.7-p299 > bx.to_json({:only => ['b', 'c']}) 
=> "{}" 

這並不工作,但是,因爲我們沒有屬性稱爲 'B' 或 'C',只值。我們怎樣才能結束這樣的事情呢?

{ "box": { "b": 200, "c": 300 } } 

更好的是,我們可以得到這個,而不必從ActiveResource繼承?

回答

1

在一個AR對象中,你只需要'to_json'的方法參數,就像這個頁面:http://www.gregbenedict.com/2007/11/28/outputting-custom-model-attributes-with-to_json/

在非AR對象中,只需定義一個自定義的to_json方法,在該方法中,您將想要的變量的哈希組合成json-ize,然後將其返回並返回它。像,這裏有一個(未經測試的)例子:

def to_json(options = {}) 
    {"box" => {"b" => b, "c" => c}}.to_json(options) 
end 
+0

感謝您的回覆,賈森。兩件簡單的事情:請注意,我在這裏使用ActiveResource,而不是ActiveRecord。另外,我不確定''方法'會在這裏工作:'bx.to_json(:methods => [:b,:c])'產生一個包含所有內容的散列。其次,不寫''b「=> b,」c「=> c,...'會相當重複嗎?有沒有一種方法可以將屬性指定爲JSON-ize? – 2010-07-28 14:26:47

+0

我的不好,在活躍的資源!對不起,我錯過了:D 關於你所問的問題:你總是可以用一個符號或字符串列表來表示你想放入JSON響應的方法。我會在上面編輯我的回覆以澄清,如果它更像是你要找的東西? – jasonpgignac 2010-07-28 19:18:18

相關問題