在我的Rails项目中使用yajl-ruby的最佳方法是什么?

Joh*_*hir 2 ruby ruby-on-rails yajl

Rails 2.3.6开始使用快速新的json库yajl-ruby,"如果可用的话".

在yajl-ruby自述文件的"JSON gem Compatibility API"部分中,它概述了一种方法,可以放入yajl-ruby包含并让应用程序的其余部分无缝地获取它.

所以,理想情况下,我想

  1. Rails使用它
  2. 我的宝石使用它
  3. 我的应用程序代码使用它

实现这一目标的最简单方法是什么?我猜:

config.gem 'yajl-ruby', :lib => 'yajl/json_gem'
Run Code Online (Sandbox Code Playgroud)

作为environment.rb中的第一个宝石.这样做不会导致任何错误,但我不知道如何知道rails是否正在为自己使用它.

谢谢!约翰

bri*_*rio 8

我建议yajl-ruby直接使用's API而不是JSON gem兼容API,主要是因为JSON gem的to_json方法与之相冲突ActiveSupport并且长期存在使它们协同工作的问题.

如果你只是这样做config.gem 'yajl-ruby', :lib => 'yajl',你将需要使用Yajl::ParserYajl::Encoder直接解析/编码对象.这样做的好处是你可以肯定不会与方法覆盖有任何冲突,因此,保证你的JSON编码/解析代码能够按预期工作.缺点是如果你使用任何使用JSON gem的gem,他们会继续这样做,但你自己的代码将使用yajl-ruby.

如果你愿意,你可以使用你的config.gem行,然后在初始化程序中,require 'yajl'这样你就可以加载两个API了.该yajl/json_gem包括将优先于使用JSON宝石与任何东西yajl-确保这将覆盖这些方法试图确保require 'yajl/json_gem'发生最后一次.

如果您使用的是Rails 3,则可以将其添加到初始化程序中:

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
Run Code Online (Sandbox Code Playgroud)

确保render :json => ...使用电话yajl-ruby.

对不起,如果这不是真的回答你的问题,但我想至少给出yajl-ruby直接使用API 的建议:)

  • 据我所知,如果你有yajl-ruby加载(和/或在你的config.gem或bundler配置中列出),Rails 2.3.6+将使用它作为它的默认JSON后端进行解析. (3认同)