Как установить для ActiveModel::Base.include_root_in_json значение false?

Я использую Rails 3 с Mongoid (поэтому без ActiveRecord). Mongoid использует метод ActiveModel «to_json», и по умолчанию этот метод включает корневой объект в JSON (чего я не хочу).

Я попытался поместить это в инициализатор:

ActiveModel::Base.include_root_in_json = false

Но получить ошибку

uninitialized constant ActiveModel::Base

Любые идеи, как я могу это изменить? Я изменил значение по умолчанию непосредственно в исходном коде, и оно работало нормально, но, очевидно, я хотел бы сделать это правильно.

Переменная определена в верхней части этого файла: Github - activemodel/lib/active_model/serializers/json.rb

Из документов: «Опция ActiveModel::Base.include_root_in_json управляет поведением верхнего уровня to_json. По умолчанию это правда».


person Mark L    schedule 17.06.2010    source источник


Ответы (4)


ActiveModel::Base.include_root_in_json = false

в инициализаторе??

person Cody Caughlan    schedule 17.06.2010
comment
Ах, я редактировал вопрос, пока вы это писали. Я уже пробовал это, и я получаю сообщение об ошибке. Есть идеи? - person Mark L; 17.06.2010
comment
Я поговорил с большим количеством людей и подтвердил, что это действительно так. У меня должно быть что-то еще в моем коде, которое все испортило. - person Mark L; 24.07.2010

Я знаю, что это старо, но вы можете сделать это по-другому, поместив это в свой класс приложения в application.rb:

# When JSON-encoding a record, don't wrap the attributes in a hash where the
# key is named after the model
config.active_record.include_root_in_json = false
person Elliot Winkler    schedule 09.02.2011
comment
Простой способ, если вам нужно, чтобы это применялось ко всем вашим моделям. - person Romain Champourlier; 27.05.2011
comment
он просил ActiveModel, а не ActiveRecord, это большая разница - person Christoph Geschwind; 19.01.2012

Вы должны просто установить его в классе, который включает модули ActiveModel:

class Person
  include ActiveModel::Validations
  include ActiveModel::Serializers::JSON
  self.include_root_in_json = false

  ...
end
person neonski    schedule 19.10.2010

Если вы предпочитаете инициализаторы, то это ActiveRecord::Base, а не ActiveModel::Base в версиях Rails 2.* и 3.1, возможно, 3.0. Просмотрел источник, и в бета-версии 3.0 он был переключен на ActiveModel, но в какой-то момент снова вернулся на ActiveRecord.

ActiveRecord::Base.include_root_in_json = false

Кроме того, если вы действительно пытаетесь использовать эту функциональность, в Rails 3.1 уместна оболочка params:

ActionController::ParamsWrapper

Оборачивает хэш параметров во вложенный хеш. Это позволит клиентам отправлять запросы POST без необходимости указывать какие-либо корневые элементы.

http://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html

person Woahdae    schedule 18.11.2011