2010-06-17 3 views
0

J'utilise Rails 3 w/Mongoid, (donc pas ActiveRecord). Mongoid utilise la méthode "to_json" d'ActiveModel, et par défaut cette méthode inclut l'objet racine dans le JSON (que je ne veux pas).Comment définir ActiveModel :: Base.include_root_in_json sur false?

J'ai essayé de mettre cela dans un initialiseur:

ActiveModel::Base.include_root_in_json = false 

Mais obtenir l'erreur

uninitialized constant ActiveModel::Base 

Toute idée comment je peux changer cela? J'ai changé la valeur par défaut directement dans le code source et cela a bien fonctionné, mais évidemment je voudrais le faire correctement. Il est vrai par défaut « L'option ActiveModel :: Base.include_root_in_json contrôle le comportement de niveau supérieur de to_json:

La variable est définie au sommet de ce fichier: Github - activemodel/lib/active_model/serializers/json.rb

De la documentation.. "

Répondre

1
ActiveModel::Base.include_root_in_json = false 

dans un initialiseur ??

+0

Ah j'éditait la question alors que vous avez écrit cela. J'avais déjà essayé et j'ai une erreur. Des idées? –

+0

J'ai parlé à plus de gens, et confirmé que c'est effectivement comment cela devrait être fait. Je dois avoir autre chose dans mon code. –

+1

J'ai aussi le même problème. L'avez-vous résolu? –

4

Vous devez simplement mettre sur la classe qui comprend les modules ActiveModel:

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

    ... 
end 
+0

Merci, cela a très bien fonctionné pour moi en utilisant un modèle neo4j –

8

Je sais que c'est vieux, mais une autre façon, vous pouvez le faire est en plaçant au sein de votre classe d'application dans 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

Le moyen facile si vous avez besoin de cela pour s'appliquer à tous vos modèles. – rchampourlier

+0

il a demandé ActiveModel, pas ActiveRecord, c'est une grande différence –

0

Si vous préférez initializers, il est ActiveRecord::Base, pas ActiveModel::Base dans les versions Rails 2. * et 3.1, peut-être 3.0. Regardé à travers la source, et dans la version 3.0 bêta, il a été commuté à ActiveModel, mais de nouveau à ActiveRecord à un moment donné.

ActiveRecord::Base.include_root_in_json = false 

En outre, dans le cas où vous essayez réellement d'utiliser cette fonctionnalité, dans Rails 3.1 Le wrapper params est pertinente:

ActionController :: ParamsWrapper

Wraps les paramètres de hachage dans un hash imbriqué. Cela permettra aux clients de soumettre des requêtes POST sans avoir à spécifier d'éléments racine.

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

Questions connexes