2010-06-17 4 views
0

Я использую Rails 3 w/Mongoid, поэтому ActiveRecord неактивен. Mongoid использует метод «to_json» ActiveModel, и по умолчанию этот метод включает в себя корневой объект в JSON (который мне не нужен).Как установить ActiveModel :: Base.include_root_in_json в false?

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

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 Это правда, по умолчанию.. "

ответ

1
ActiveModel::Base.include_root_in_json = false 

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

+0

Ач Я редактировал вопрос, когда вы писали это. Я уже пробовал это, и я получаю сообщение об ошибке. Есть идеи? –

+0

Я разговаривал с большим количеством людей и подтвердил, что это действительно так, как это должно быть сделано. У меня должно быть что-то еще в моем коде. –

+1

У меня тоже такая же проблема. Вы разрешили это? –

4

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

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

    ... 
end 
+0

Спасибо, это сработало очень хорошо для меня, используя модель neo4j. –

8

Я знаю, что это старый, но еще один способ сделать это, помещая это в пределах вашего класса приложения в 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 
+0

Простой способ, если вам это нужно, чтобы применить ко всем вашим моделям. – rchampourlier

+0

он попросил ActiveModel, а не ActiveRecord, это большая разница –

0

Если вы предпочитаете инициализаторами, это 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