Я создаю Rails 5+ API с JSON в качестве формата между интерфейсом и бэкэндом.
Мне нужна возможность создавать одну запись или несколько записей, в зависимости от того, является ли массив объектов JSONотправлено.
Обратите внимание, что я не использую JSON: API-спецификацию, а скорее объекты JSON приходят в качестве корневых атрибутов.
# Create a single child object for the associated parent
POST api/v1/parents/1/children PARAMS: { child_name: "Alpha" }
# Create multiple children objects for the associated parent
POST api/v1/parents/1/children PARAMS: [{ child_name: "Alpha" }, { child_name: "Bravo" }]
В контроллере я должен различать, если одинобъект или массив отправляется.Похоже, что Rails автоматически преобразует данные JSON в ключ params["_json"]
, если установлен заголовок Content-Type="application/json"
, и я использую это, чтобы узнать, был ли передан массив или нет.
class ChildrenController < ApplicationController
def create
@parent = Parent.find(params[:parent_id])
if params["_json"] && params["_json"].is_a?(Array)
@children = []
params["_json"].each do |child_attributes|
@children << @parent.children.create!(child_attributes)
end
render json: @children
else
@child = @parent.children.create!(child_params)
render json: @child
end
end
def child_params
params.permit(:child_name)
end
end
Вопросы
- Использует ли
params["_json"]
стандартный способ определить, был ли передан массив или нет?Это кажется хакерским, но я не уверен в лучшем способе. - Если передан массив объектов JSON, как я все еще могу использовать метод StrongParameters
child_params
?В настоящее время, если пользователь передает массив объектов JSON, он может поместить любые атрибуты, которые он хочет, и я не фильтрую их. - Есть ли лучший способ реализовать эту функцию?Мне не нужно использовать одну конечную точку как для одного, так и для множественного создания, я просто подумал, что было бы удобнее иметь одну конечную точку API, которая может обрабатывать один или несколько объектов.
- Я также планирую создатьодна конечная точка для действия
update
, которая также может принимать один или несколько объектов.Это плохая практика?