2010-06-18 3 views
2

Rails 2.3.6 commencé à utiliser la nouvelle bibliothèque json rapide, yajl-ruby, "if available". Dans la section "JSON gem Compatibility API" du readme yajl-ruby, il décrit une méthode permettant de simplement laisser tomber l'inclusion de yajl-ruby et de faire en sorte que le reste de l'application le récupère de façon transparente.Quelle est la meilleure façon d'utiliser yajl-ruby avec mon projet Rails?

Donc, idéalement, je voudrais

  1. Rails pour l'utiliser
  2. Mes pierres précieuses pour l'utiliser
  3. Mon code d'application pour l'utiliser

Quelle est la meilleure façon de atteindre cet? Ma conjecture:

config.gem 'yajl-ruby', :lib => 'yajl/json_gem' 

Comme la première gemme dans environment.rb. Cela n'entraîne aucune erreur, mais je ne sais pas comment savoir si les rails l'utilisent pour son propre usage.

Merci! John

Répondre

8

Je vous recommande d'utiliser l'API de yajl-ruby directement au lieu de l'API de compatibilité de gemme JSON principalement pour la raison que la méthode de gemme JSON to_json conflit avec ActiveSupport et a eu des problèmes de longue date les faire fonctionner ensemble.

Si vous faites simplement config.gem 'yajl-ruby', :lib => 'yajl' à la place, vous devrez utiliser Yajl::Parser et Yajl::Encoder directement pour analyser/encoder des objets. L'avantage de ceci est que vous serez certain qu'il n'y aura pas de conflits avec les substitutions de méthode et que votre code de codage/analyse syntaxique JSON fonctionnera comme prévu. L'inconvénient est que si vous utilisez des gemmes qui utilisent la gemme JSON, ils continueront à le faire, mais votre propre code utilisera yajl-ruby.

Si vous le souhaitez, vous pouvez utiliser votre ligne config.gem, puis dans un initialiseur require 'yajl' pour que les deux API soient chargées. L'include yajl/json_gem remplacera tout ce qui utilise la gemme JSON avec yajl - pour s'assurer que cela remplace ces méthodes, essayez de vous assurer que require 'yajl/json_gem' arrive en dernier.

Si vous utilisez Rails 3, vous pouvez l'ajouter à un initialiseur:

ActionController::Renderers.add :json do |json, options| 
    json = Yajl.dump(json) unless json.respond_to?(:to_str) 
    json = "#{options[:callback]}(#{json})" unless options[:callback].blank? 
    self.content_type ||= Mime::JSON 
    self.response_body = json 
end 

Pour faire render :json => ... vous que les appels utilisent yajl-ruby aussi bien.

Désolé si ce n'est pas vraiment répondre à votre question, mais je voulais au moins donner la suggestion d'utiliser l'API de yajl-ruby directement :)

+0

Wow, merci pour une réponse très complète avec beaucoup d'options. Mais je pense vraiment que je ne sais toujours pas comment atteindre # 1 dans ma liste - ayant des rails remarquer yajl-ruby et l'utiliser. :) –

+3

Pour autant que je sache, si vous avez chargé yajl-ruby (et/ou listé dans votre config.gem ou bundler config), Rails 2.3.6+ l'utilisera comme backend JSON par défaut pour l'analyse syntaxique. – brianmario

Questions connexes