Сделать 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. НТН.