используя разные ключи для to_json: методы - PullRequest
7 голосов
/ 15 марта 2010

При использовании :methods в to_json есть ли способ переименовать ключ? Я пытаюсь заменить реальный идентификатор версией base62 и хочу, чтобы значение base62_id имело ключ :id.

.
@obj.to_json(
    :except => :id
    :methods => :base62_id
)

Я пытался сделать

@obj.to_json(
    :except => :id
    :methods => { :id => :base62_id }
)

но это не сработало.

Любой совет?

1 Ответ

2 голосов
/ 15 марта 2010

Сериализатор to_json использует имя метода в качестве ключа для сериализации. Таким образом, вы не можете использовать опцию methods для этого. К сожалению, метод to_json не имеет параметра t accept block`, иначе вы могли бы сделать что-то похожее на

@obj.to_json(:except => :id) {|json| json.id = base62_id }

Так что это оставляет нас с безобразным хаком, таким как:

def to_json(options={})
  oid, self.id  = self.id, self.base62_id(self.id) 
  super
ensure
  self.id = oid
end

Теперь to_json вернет ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...