在数组上调用to_json会返回与在object中调用to_json不同的东西

时间:2014-01-18 12:05:05

标签: ruby json sinatra

我正在使用Sinatra开发一个小应用程序。到目前为止这么好,但我有一个非常小的问题,我不明白为什么会发生这种情况。

我有一个带有自定义to_json的类Note:

class Note < ActiveRecord::Base
   #id
   #name
   #body
   #created_at
   #updated_at

   def to_json(options={})
    {   'id' => self.id,
        'name' => self.name,
        'body' => self.body,
    }.to_json
   end
end 

如果我打电话:

Note.first.to_json

它返回:

=> "{\"id\":1,\"name\":\"this is the name\",\"body\":\"this is the body\"}"

如果我在数组中添加对象并调用该数组的to_json

array = Array.new
array.push Note.first
array.to_json

它返回:

=> "[{\"id\":1,\"name\":\"this is the name\",\"body\":\"this is the body\",\"updated_at\":\"2014-01-17T22:00:45-03:00\",\"created_at\":\"2013-04-17T21:21:20-03:00\"}]"

所以来自班级Note的to_json没有被调用,因为我仍然得到updated_atcreated_at

我做错了什么? (顺便说一句,我正在使用json gem)

感谢。

2 个答案:

答案 0 :(得分:3)

将您的to_json方法重命名为as_json,删除散列上的.to_json,它应该有效。

def as_json(options={})
  {
   'id' => self.id,
   'name' => self.name,
   'body' => self.body,
  }
end

答案 1 :(得分:0)

您可以在将记录添加到阵列之前序列化记录:

array = []
array << Note.first.to_json
array.to_json