2010-06-18 70 views
2

Rails 2.3.6開始使用快速新的json庫,yajl-ruby,"if available"在我的Rails項目中使用yajl-ruby的最佳方式是什麼?

在yajl-ruby自述文件的「JSON gem Compatibility API」部分中,它概述了一種只包含yajl-ruby包含的方法,並讓應用程序的其餘部分無縫地接受它。

所以,理想情況下,我想

  1. Rails的使用它
  2. 我的寶石使用它
  3. 我的應用程序代碼來使用它

什麼是最簡單的方法做到這一點?我的猜測:

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

作爲environment.rb中的第一個gem。這樣做並不會導致任何錯誤,但我不確定如何知道軌道是否正在自行使用。

謝謝! 約翰

回答

8

我推薦使用yajl-ruby的API,而不是直接的JSON寶石兼容性API主要針對的是JSON寶石的to_jsonActiveSupport,並曾長期衝突等問題使得他們一起工作的原因。

如果您只是使用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 

爲了確保render :json => ...呼叫使用yajl-ruby爲好。

很抱歉,如果這是不是真的回答你的問題,但我想至少給使用yajl-ruby的API直接:)

+0

哇,感謝了很多的選項非常全面的答案的建議。但我實際上認爲我還不知道如何在列表中實現#1 - 使用rails注意yajl-ruby並使用它。 :) – 2010-06-19 11:51:43

+3

據我所知,如果您已經加載了yajl-ruby(和/或在您的config.gem或bundler配置中列出),Rails 2.3.6+將使用它作爲解析的默認JSON後端。 – brianmario 2010-06-20 07:49:13

相關問題