Сделать root node в Active Serializer модели

Привет, ребята, у меня есть массив JSON в моем приложении Rails в этом формате с помощью Active Model Serializer

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

Как сделать так, чтобы я удалял один уровень node над контактом ИСПОЛЬЗОВАНИЕ активного сериализатора модели следующим образом:

[
 {
 },
 {
 }
]

Я также хочу удалить имя node "контакт"

Ответ 1

Это было описано в RailsCast # 409 Сериализаторы Active Model.

Чтобы удалить корень node, вы добавляете 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

Ответ 2

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

format.json { render json: @contacts}

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

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

format.json { render json :@contacts, :root => 'contact' }

Ответ 3

/config/initializers/serializer.rb

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

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

Ответ 4

Для пользователей, использующих 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. НТН.