Я боролся с этим целый день.В моем приложении 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)
.
Теперь я в полном замешательстве.