Swagger: Представление свойства enum в ha sh error - PullRequest
1 голос
/ 24 марта 2020

В настоящее время я работаю над документацией Swagger для Ruby по Rails API. API имеет множество перечислителей (enume), которые включены в различные модели. Перечисления хранятся в виде хешей , а не массивов в каталоге app/models/concerns, чтобы их можно было без проблем изменить позже.

Состояние Enum (состояние .rb)

module State
  extend ActiveSupport::Concern
  included do
    enum state: { state1: 'State 1',
                  state2: 'State 2',
                  state3: 'State 3',
                  state4: 'State 4',
                  state5: 'State 5' }
  end
end

Однако, когда я пытаюсь представить это в схеме компонентов в Swagger следующим образом:

components:
  schemas:
    State:
      type: object
      properties:
        enum: { state1: 'State 1',
                state2: 'State 2',
                state3: 'State 3',
                state4: 'State 4',
                state5: 'State 5' }

Я получаю ошибку:

не должен иметь дополнительных свойств

state1: 'State 1'

state2: 'State 2'

state3: 'State 3'

state4: 'State 4'

state5: 'State 5'

Я хочу представить перечисления в хешах , а не в массивах . Есть ли способ обойти эту работу? Спасибо.

1 Ответ

1 голос
/ 25 марта 2020

Я наконец нашел способ сделать это. Это решение применимо к OpenAPI 3 - последней версии спецификации OpenAPI в качестве пункта ответа на этот вопрос.

Вот как я это сделал :

Решение 1

components:
  schemas:
    State:
      type: object
      additionalProperties:
        type: string
      example:
        state1: State 1
        state2: State 2
        state3: State 3
        state4: State 4
        state5: State 5

Это передавало весь га sh в тело ответа на запрос и, таким образом, выдавало ошибки

Решение 2:

Другой способ - представить их как массивы, что не было моим идеальным решением, но позволило Swagger выбрать только один элемент из массива для передачи в тело ответа на запрос. Однако я хотел бы принять к сведению, что перечисления являются хешами, и мне придется сделать collection_select из hashes для перечислений на моей стороне клиента.

components:
  schemas:
    State:
      type: string
      description: List of States
      enum:
        - State 1
        - State 2
        - State 3
        - State 4
        - State 5

Наконец , какое бы решение вы ни выбрали, вы можете ссылаться на них в других моделях, например так:

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
          format: int64
        first_name:
          type: string
        last_name:
          type: string
        password:
          type: string
          format: password
        state:
          $ref: '#/components/schemas/State'

Вот ссылка на документацию Swagger: Словари, HashMaps и ассоциативные массивы

Вот и все.

Надеюсь, это поможет

...