Rails 5+ API: одна конечная точка как для отдельного объекта JSON, так и для массива объектов JSON - PullRequest
0 голосов
/ 15 октября 2018

Я создаю 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

Вопросы

  1. Использует ли params["_json"] стандартный способ определить, был ли передан массив или нет?Это кажется хакерским, но я не уверен в лучшем способе.
  2. Если передан массив объектов JSON, как я все еще могу использовать метод StrongParameters child_params?В настоящее время, если пользователь передает массив объектов JSON, он может поместить любые атрибуты, которые он хочет, и я не фильтрую их.
  3. Есть ли лучший способ реализовать эту функцию?Мне не нужно использовать одну конечную точку как для одного, так и для множественного создания, я просто подумал, что было бы удобнее иметь одну конечную точку API, которая может обрабатывать один или несколько объектов.
  4. Я также планирую создатьодна конечная точка для действия update, которая также может принимать один или несколько объектов.Это плохая практика?
...