2010-09-18 17 views
3

De mes Rails 3 app je veux un JSON comme ceci: {count: 10, images: [ {id: 1}, ...] } J'ai essayéRails3: Prenez le contrôle de produit JSON (to_json avec DataMapper ORM)

render(:json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) }) 

mais dans ce cas, mes photos get se sont échappés

..."pictures":"[{\"id\":2653299}, .... 

dans mon ancienne application Merb j'ai eu la simple ligne suivante dans mon contrôleur:

display({ :count=>@count, :pictures => @pictures }) 

Parce que je me sers datamapper comme mon ORM et dm-serializer Je ne sais pas où d'influencer le JSON généré.

Répondre

0

Votre code doit être:

render(:json => {:count => 10, :pictures => @pictures }) 

sans appeler: to_json explicitement sur @pictures (le même que dans votre application merb).

Cependant, cela bombe dans dm-1.0 sans ce commit: http://github.com/datamapper/dm-serializer/commit/64464a03b6d8485fbced0a5d7150be90b6dcaf2a

J'imagine que ce sera publié bientôt, mais en attendant, il est simple à patcher.

modifier

Je compte du fait que vous souhaitez utiliser: uniquement => [: id] sur votre collection. Cela ressemble à: as_json n'a pas été implémenté sur les collections pour une raison quelconque. Vous pouvez contourner cela de plusieurs façons. Votre exemple peut ressembler à ceci:

render(:json => {:count => 10, :pictures => @pictures.map {|p| p.as_json(:only => [:id])}}) 

Cela transformera votre collection d'images en un hachage d'ID. Le rendu fera alors son thang correctement et vous devriez obtenir vos résultats désirés. (Je l'espère)

+0

Je vois. Ainsi, le datamapper est responsable de la sérialisation, pas un module ActiveModel sophistiqué. Je vais essayer le week-end. Merci. – DeSchleib

0

Essayez d'utiliser la fonction "brute". Rails 3 échappe à la sortie dans la vue par défaut. Essayez quelque chose comme ceci:

raw render(:json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) }) 

ou il peut être possible d'échapper à l'intérieur de la fonction de rendu (bien, je ne l'ai jamais essayé):

render(:json => { :count => 10, :pictures => raw(@pictures.to_json(:only=>:id)) }) 
+0

Même après certains comprennent ActionView :: :: Helpers RawOutputHelper cela ne fonctionne pas, la sortie sera toujours échappé. – DeSchleib