Какой лучший способ использовать yajl-ruby с моим проектом Rails? - PullRequest
2 голосов
/ 19 июня 2010

Rails 2.3.6 начал использовать быструю новую библиотеку json, yajl-ruby , "если доступно" .

В разделе «API-интерфейс JSON gem для совместимости» в файле readme yajl-ruby описывается метод простого добавления включения yajl-ruby, чтобы остальная часть приложения легко могла его найти.

Итак, в идеале, я бы хотел

  1. Rails для его использования
  2. Мои драгоценные камни, чтобы использовать его
  3. Код моего приложения для его использования

Какой самый простой способ добиться этого? Мое предположение:

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

Как самый первый драгоценный камень в environment.rb. Это не приводит к ошибкам, но я не уверен, как узнать, подхватывает ли rails его для собственного использования.

Спасибо! John

1 Ответ

8 голосов
/ 19 июня 2010

Я бы порекомендовал использовать API yajl-ruby напрямую вместо API совместимости с гемами JSON, главным образом по той причине, что метод to_json драгоценного камня JSON конфликтует с ActiveSupport и имеет давние проблемы, заставляющие их работать вместе.

Если вы просто вместо этого сделаете config.gem 'yajl-ruby', :lib => 'yajl', вам нужно будет использовать Yajl::Parser и Yajl::Encoder напрямую для анализа / кодирования объектов.Преимущество этого заключается в том, что вы будете уверены, что не будет никаких конфликтов с переопределениями методов, и поэтому гарантированно будет работать код кодирования / синтаксического анализа JSON.Недостатком является то, что если вы используете какие-либо гемы, которые используют гем JSON, они будут продолжать это делать, но ваш собственный код будет использовать yajl-ruby.

Если вы хотите, вы можете использовать свойСтрока config.gem, затем в инициализаторе require 'yajl', чтобы вы загрузили оба API.yajl/json_gem include будет переопределять все, что использует гем 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 напрямую:)

...