在每个对象上使用不同方法调用数组上的to_json

时间:2013-03-06 23:04:36

标签: ruby-on-rails ruby json sinatra

我有一个sinatra服务将json数组对象返回到我的rails应用程序。对象都是不同的类型。我正在尝试将:methods选项传递给to_json调用,但是每个对象都需要调用不同的方法。下面的代码不起作用,因为我正在返回一个json对象数组。

params = {:assets => {'1' => {:asset_type => "file", :urls => [:original]},
                      '2' => {:asset_type => "image", :urls => [:original, :thumbnail]}
                     }
         }

get 'url' do
  assets = []

  params[:assets].each do |asset_id,asset_params|
    asset = Asset.find asset_id
    methods = asset_params[:urls]
    asset_json = asset.to_json :methods => methods
    assets << asset_json
  end
  assets
end

#expected output:

[{"id" => 1, "type" => "file", "original" => "/filesystem/asset/1/filename.txt"}, {"id" => 2, "type => "image", "original" => "/filesystem/asset/2/image.jpg", "thumbnail" => "/filesystem/asset/2/image_thumb.jpg"}]

有没有办法可以将assets数组转换为json而不对该数组中的每个对象执行此操作?或者其他一些方式来回报我想要的东西?感谢。

一位同事建议的解决方案似乎有效,但有点hacky。返回值可能是(因为to_json实际上只是创建一个字符串):

"[" + assets.join(',') + "]" 

1 个答案:

答案 0 :(得分:0)

快速解决方案:不要返回assets,而是assets.to_json。 (对此的理想解决方案是不要为每个资产调用to_json,但最后只调用一次。)

旁注:请不要说to_json“真的只是创建一个字符串”。如果这很容易,我们就不需要json宝石。