Метод rails hash.as_json, выдающий неожиданный результат с логическим значением - PullRequest
3 голосов
/ 20 июня 2011

Ruby on Rails добавляет метод "as_json" ко многим распространенным классам, который превращает объекты ActiveRecord в хеш-объекты, которые затем можно отправлять в сериализатор JSON. Недавно я столкнулся с ошибкой в ​​моем коде, связанной с этим методом, и он обрабатывает логические значения.

Я могу кратко изложить ошибку:

{"foo" => true}.as_json

Я ожидаю, что этот метод вернет идентичный хеш. Вместо этого он возвращает

{"foo" => "true"}

Похоже, что это предусмотрено проектом, согласно строке 157 в encoding.rb

AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze

Могу ли я спросить, почему rails возвращает строковое значение "true" вместо того, чтобы сохранять его как истинное логическое значение?

Моя ошибка заключается в следующем: я храню сериализованные объекты JSON в кэше. Когда я вытаскиваю их из кэша, я оставляю их как хэши, чтобы избежать ненужной десериализации объектов. Если я не нахожу его в кеше, я вытаскиваю объект из базы данных и вызываю на нем as_json. Я ожидаю, что то, что я извлекаю из кэша и что я получаю из as_json, будет идентичным. Это не так, потому что из кеша выходит {"foo" => true}, а из as_json возвращается {"foo" => "true"}

1 Ответ

1 голос
/ 03 июля 2011

Вот как это реализовано.

Вы можете изменить поведение по умолчанию, поместив его в инициализатор:

class TrueClass
  def as_json(*options)
    self
  end
end

class FalseClass
  def as_json(*options)
    self
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...