Критические изменения в рендеринге Rails 4 JSON?

Я начал новое приложение поверх Rails 4 и заметил то, что кажется критическим изменением в том, как рендеринг JSON реализован по умолчанию, но я нигде не могу найти его написанным, поэтому мне было интересно, может ли кто-нибудь дать мне некоторое представление на (1) действительно ли изменился API и (2) как я могу получить поведение, которое мне нужно (а именно, старое поведение).

В частности, я вижу, что в Rails 3

@answer.as_json

...вернутся...

{
  id: 1,
  body: "lorem ipsum..."
  ....
}

в Rails 4 кажется, что возвращается тот же метод:

{
  'answer':
    {
      id: 1,
      body: "lorem ipsum..."
      ...
    }
}

Может ли кто-нибудь еще подтвердить, что это поведение изменилось? Есть ли способ вернуть старое поведение, за исключением переопределения as_json для каждой модели?

Эта новая реализация делает более громоздким возврат ответов JSON, содержащих несколько моделей (что теперь должно быть выполнено либо слиянием хэшей в вызове «render :json ..." в действии контроллера, либо путем переопределения as_json).


person Nick Z    schedule 18.05.2013    source источник
comment
ты смотрел в config/initializers/wrap_parameters.rb?   -  person NARKOZ    schedule 18.05.2013


Ответы (1)


Существует опция ActiveRecord::Base.include_root_in_json, которая управляет поведением верхнего уровня метода as_json. Название говорит само за себя, я думаю.

Что касается критического изменения API: если вы покопаетесь в исходном коде, вы увидите, что значение по умолчанию для этой опции было изменено на true в Rails 4.0.0.beta1, но позже он был возвращен к false в Rails 4.0.0.rc1.

Если вы хотите быть уверены, что JSON не будет содержать корневой узел, укажите параметр include_root_in_json в config/initializers/wrap_parameters.rb:

ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = false
end
person Ilya Khokhryakov    schedule 18.05.2013
comment
Спасибо! Хотелось бы, чтобы это было лучше разрекламировано. По крайней мере, когда люди в бета-версии 1 (или любой будущей версии, которая меняет настройки по умолчанию) заметят это, они, надеюсь, попадут на эту страницу. - person Nick Z; 19.05.2013
comment
@NickZ знаете ли вы, что можете пометить полезный ответ как принятый? ;) - person Ilya Khokhryakov; 19.05.2013