Сделать корневой узел в Active Model Serializer

У меня есть массив JSON в моем приложении Rails в этом формате с использованием Active Model Serializer:

[
  {
    "contact" : {}
  },
  {
    "contact" : {}
  }
]

Как мне сделать так, чтобы я удалил один уровень узла выше контакта, ИСПОЛЬЗУЯ сериализатор активной модели, например:

[
 {
 },
 {
 }
]

Я также хочу удалить имя узла «контакт».


person Madhan    schedule 11.03.2013    source источник


Ответы (4)


Это описано в Сериализаторы активных моделей RailsCast #409.

Чтобы удалить корневой узел, вы добавляете root: false в вызов render в своем контроллере. Предполагая, что ваши contact в JSON получены из метода contacts#index, ваш код может выглядеть примерно так:

def index
  @contacts = Contacts.all
  respond_to do |format|
    format.html
    format.json { render json: @contacts, root: false }
  end
end

Или, если вам не нужны корневые узлы ни в одном из ваших JSON, в вашем ApplicationController добавьте следующий метод:

def default_serializer_options
  {root: false}
end
person Paul Fioravanti    schedule 12.03.2013
comment
У меня действительно такая установка. Я видимо не правильно объяснил. Объект имеет список атрибутов, включая контактный объект, и я скрыл все остальные атрибуты. Я просто хочу, чтобы контактный объект был корнем. - person Madhan; 12.03.2013

Для людей, использующих ActiveModel::Serializer v0.10.x, вам нужно будет создать инициализатор и включить следующее:

# config/initializers/serializer.rb
ActiveModelSerializers.config.adapter = :json
ActiveModelSerializers.config.json_include_toplevel_object = true

Затем просто перезапустите приложение, и вы должны получить желаемые корневые объекты.

Это работает в Rails 5.1.x. YMMV. ХТН.

person Dan Laffan    schedule 29.08.2017

Обычно корневой узел по умолчанию имеет имя вашего контроллера, если я не ошибаюсь.

format.json { render json: @contacts}

Конечно, вам нужно удалить root false, он удаляет имя узла.

Если вы хотите, чтобы контакт был корневым объектом, используйте это:

format.json { render json :@contacts, :root => 'contact' }
person rbinsztock    schedule 17.03.2013

/config/initializers/serializer.rb

ActiveModelSerializers.config.adapter = :json_api # Default: `:attributes`

По умолчанию ActiveModelSerializers будет использовать адаптер атрибутов (без корня JSON). Но мы настоятельно рекомендуем вам использовать адаптер JsonApi, который соответствует формату 1.0, указанному на jsonapi.org/format.

person Albert.Qing    schedule 16.11.2016