这是一个简单的ActiveResource类。它有一些实例变量甚至可能是某些方法,但它没有任何数据支持。
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模型选择一些实例变量?假设我们只关心b
和c
但不关注a
,d
或其他任何内容。
ruby-1.8.7-p299 > bx.to_json({:only => ['b', 'c']})
=> "{}"
然而,这不起作用,因为我们没有名为“b”或“c”的属性,只有值。我们怎么能得到这样的东西呢?
{ "box": { "b": 200, "c": 300 } }
更好的是,我们可以在不必继承ActiveResource的情况下获得这个吗?
答案 0 :(得分:1)
在AR对象中,您只需使用to_json的'methods'参数,就像在此页面上一样:http://www.gregbenedict.com/2007/11/28/outputting-custom-model-attributes-with-to_json/。
在非AR对象中,只需定义一个自定义的to_json方法,在其中组合您想要json-ize的变量的哈希值,然后to_json它,并返回它。比如,这是一个(未经测试的)示例:
def to_json(options = {})
{"box" => {"b" => b, "c" => c}}.to_json(options)
end
答案 1 :(得分:0)
尝试使用YAJL-ruby将哈希编码为json格式。
require 'yajl'
hash = {:only => ['b', 'c']}
Yajl::Encoder.encode(hash)
=> "{\"only\":[\"b\",\"c\"]}"