Переопределить имя класса модели as_json или to_json - PullRequest
5 голосов
/ 01 апреля 2010

Я хотел бы изменить имя класса при вызове to_json для модели AR.

т.е.

Book.first.to_json
 #=> "{\"book\":{\"created_at\":\"2010-03-23 

Book.first.to_json(:root => 'libro')
 #=> "{\"libro\":{\"created_at\":\"2010-03-23 

Есть ли возможность сделать это?

Ответы [ 3 ]

28 голосов
/ 04 апреля 2010

Для совместимости с Rails 3 переопределите as_json вместо to_json. Это было введено в 2.3.3:

def as_json(options={})
  { :libro => { :created_at => created_at } }
end

Убедитесь, что ActiveRecord::Base.include_root_in_json = false. Когда вы вызываете to_json, за сценой as_json используется для построения структуры данных, а ActiveSupport::json.encode используется для кодирования данных в строку JSON.

6 голосов
/ 30 июля 2011

Начиная с версии 3.0.5, по крайней мере, теперь у вас есть возможность передать опцию: root в вызов to_json. Вот источник метода as_json для активной записи сейчас.

def as_json(options = nil)
    hash = serializable_hash(options)

    if include_root_in_json
      custom_root = options && options[:root]
      hash = { custom_root || self.class.model_name.element => hash }
    end

    hash
end

Так что использовать это просто @obj.to_json(:root => 'custom_obj')

0 голосов
/ 02 апреля 2010

Вы можете переопределить метод to_json по умолчанию в вашей модели, создать хеш необходимых атрибутов, а затем вызвать для этого метод to_json хеша.

class Book < ActiveRecord::Base

  def to_json
    { :libro => { :created_at => created_at } }.to_json
  end

end

#=> "{\"libro\":{\"created_at\":\"2010-03-26T13:45:28Z\"}}"

Или, если вы хотите, чтобы все атрибуты записей ...

def to_json
  { :libro => self.attributes }.to_json
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...