J'ai besoin de sérialiser un modèle à JSON et que toutes les clés soient camélisées. Je vois qu'il y a une option dans TO_XML pour autoriser le boîtier de chameau. Je ne peux pas sembler confondre la sérialisation du Json à me donner un hachage camélisé. Est-ce quelque chose qui est possible dans les rails? P>
5 Réponses :
Il me semble étrange d'utiliser des noms d'attribut camélisés dans les rails, encore moins Json. Je sert aux conventions et j'utiliserais des noms de variables soulignés. P>
Cependant, jetez un coup d'œil à ce joyau: Rabl . Il devrait être capable de vous aider. P>
Bert- tu es sur la balle. Merci d'avoir examiné cette question aussi. J'essaie d'obtenir les rails API JSON pour être aussi propre que possible pour le développement JavaScript à l'autre extrémité. Rabl ressemble à cela pourrait me sauver une tonne de temps! Merci!
JavaScript utilise Camelcase par convention, n'aurait-il pas plus de sens que les attributs JSON soient aussi camélisés?
Conseil: Si vous utilisez quelque chose comme NGRESOURCE qui n'aime pas le JSON-API Réponses de style de Rabl, essayez d'utiliser Object @thing => false code> pour les objets et
pour les objets et
: Object_root => faux code> sur l'enfant et les collections
Utilisation directe avec Rabl Renderer, vous pouvez passer un modèle en ligne, au lieu de la récupérer à partir d'un fichier:
Rabl::Renderer.new("\nattributes :name, :description", object).render
J'ai eu un problème similaire. Après un peu de recherche, j'ai enveloppé le As_json Méthode Activemodel avec une aide qui caméliore les touches de hachage. Ensuite, j'inclurais le module dans le (s) modèle (s) correspondant (s):
# lib/camel_json.rb module CamelJson def as_json(options) camelize_keys(super(options)) end private def camelize_keys(hash) values = hash.map do |key, value| [key.camelize(:lower), value] end Hash[values] end end # app/models/post.rb require 'camel_json' class Post < ActiveRecord::Base include CamelJson end
Pour des raisons purement scientifiques, j'ai utilisé ce code, mais j'ai dû le modifier pour vérifier que la clé et la valeur ne sont pas nulles. Mettez-le dans valeurs = hachap.map do | clé, valeur | code> changement mineur, je pensais juste que je le mentionnerais.
Notez que cette mise en œuvre ne convertira pas les clés de hachages imbriquées. Par exemple, user.as_json (uniquement: [: [: first_name], inclure :: mailing_address) code> laissera
zip_code code> snake-cased:
{"firstName" => " Alan "," mailingaddress "=> {" id ": 1," zip_code "=>" 10004 "} code>.
Si vous utilisez des rails, ignorez la dépendance ajoutée et utilisez hachage # profonde_transform_keys code>. Il a également l'avantage supplémentaire de caméliser (pratique si vous faites quelque chose comme
user.as_json (comprend:: my_associated_model) code>):
h = {"first_name" => "Rob", "mailing_address" => {"zip_code" => "10004"}}
h.deep_transform_keys { |k| k.camelize(:lower) }
=> {"firstName"=>"Rob", "mailingAddress"=>{"zipCode"=>"10004"}}
Pour mon cas, j'étais tenu de personnaliser certains noms clés.
Utilisation forte> p> Mise en œuvre forte> p>
Basé sur la recommandation de Bert, nous sommes allés avec Rabl. Impossible de ne pas être plus heureux, voici un tutoriel pour faire rouler avec Rabl: blog.dcxn.com/2011/06/22/Rails-json-Templates-through-rabl
Comment avez-vous eu Rabl pour revenir à JSON camélisé?