Тонкая настройка хэша # to_json - PullRequest
1 голос
/ 26 июня 2010

Я боролся с этим целый день.В моем приложении Rails 2.3.5 у меня была куча пользовательского кода, который позволял выполнять следующее:

>> strip_hash_keys_for_json({ "a" => 1 }).to_json
=> "{ a: 1 }"

Итак, вы видите, что строковые ключи не заключаются в кавычки.Он был реализован путем создания класса-потомка String, который возвратил self из to_json, и все хеш-ключи были упакованы в этот класс.

Сегодня я начал обновлять приложение до Rails 3и он перестал работать, так как материал JSON-кодирования был переписан довольно серьезно.

Как вы, возможно, знаете, в Rails 3 создание JSON-представления хэша включает два метода:

  • as_json, который определяет, какие элементы хэша должны присутствовать в JSON
  • encode_json, который фактически возвращает строковое представление, содержащее JSON

Я полагал, что яможет изменить ход событий, наблюдая за тем, что делает encode_json, и настраивая некоторые методы, которые оттуда вызываются.

Проблема в том, что эти два метода вообще не вызываются.Я проверял каждую глупую ошибку, которую я мог сделать в своих расследованиях, и я не вижу ничего плохого.Google тоже не помогает, поэтому я обращаюсь к SO SO за помощью.

Большое спасибо.

ОБНОВЛЕНИЕ

ОК, так что я решилдля того, чтобы эти методы работали, я должен использовать ActiveSupport::JSON::encode напрямую вместо to_json.Это кажется странным, потому что я думал, что {}.to_json обрабатывается методом Object#to_json, определенным в том же файле encoding.rb, который, в свою очередь, вызывает ActiveSupport::JSON.encode(self, options).

Теперь я в полном замешательстве.

1 Ответ

0 голосов
/ 27 июня 2010

Что происходит, когда вы удаляете strip_hash_keys_for_json?

Я открыл консоль и получил:

ruby-1.8.7-p249 > Rails::VERSION::STRING
 => "2.3.5"
ruby-1.8.7-p249 > { "a" => 1 }.to_json
 => "{\"a\":1}" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...