to_json在数组中包装单个对象?

时间:2012-11-28 06:55:28

标签: ruby-on-rails activerecord sinatra

在我的API中,我通过以下方式将ActiveRecord对象转换为json:

user.to_json :methods => :new_messages

使用irb,当我执行此语句时,我得到:

{someAttr: someValue, ....}

这是完美的。这是一个单个对象,因此它不包含在数组中。现在,当我在sinatra app中运行这样的时候:

get '/api/users/:fb_id' do |fb_id|
    user = User.where :fb_id => fb_id
    user.to_json :methods => :new_cookies
end

它将它包装在一个阵列中!像这样:

[{someAttr: someValue, ....}]

我如何解决这个问题,更重要的是,为什么?!?

2 个答案:

答案 0 :(得分:1)

只需使用Hash.[]

 Hash[{a: :b}]
 # => {:a=>:b}
  

更重要的是,为什么?!?

您在第二个示例中使用了哪些ORM?如果它是ActiveRecord,则User.where :fb_id => fb_id会返回ActiveRecord::Relation对象,当您调用.to_json时,该对象将包装到数组中。它可以像这样修复

get '/api/users/:fb_id' do |fb_id|
  user = User.find_by_fb_id(fb_id)
  user.to_json :methods => :new_cookies
end

答案 1 :(得分:1)

替换此行:

user = User.where :fb_id => fb_id

这一行:

user = User.find_by_fb_id fb_id