как сделать массив объектов для винограда

Я создаю API-интерфейсы, используя Grape Api для приложения rails.

Сейчас я пытаюсь использовать эту форму: введите здесь описание изображения

И это вывод:

{
    "page_score_master": {
        "issue_date": "2014-06-23"
    },
    "press_id": "1",
    "print_date": "2014-06-23",
    "product_id": 1,
    "pull_id": 2,
    "press_run_id": 1,
    "total_section": 1,
    "ssa": [
        {
            "ss": {
                "section_name": "A"
            },
            "ss1": {
                "section_name": "B"
            }
        }
    ],
    "foreman_id": 1,
    "pic_id": 1,
    "score_sheet_master_id": 1,
    "score_sheet_sections_attributes": {
        "score_sheet_id": "1"
    },
    "route_info": {
        "options": {
            "description": "create score sheet",
            "params": {
                "page_score_master": {
                    "required": true,
                    "type": "Hash"
                },
                "page_score_master[issue_date]": {
                    "required": true,
                    "type": "String"
                },
                "print_date": {
                    "required": true,
                    "type": "String"
                },
                "total_section": {
                    "required": true,
                    "type": "Integer"
                },
                "ssa": {
                    "required": false,
                    "type": "Array"
                },
                "ssa[section_name]": {
                    "required": false,
                    "type": "String"
                },
                "ssa[total_pages]": {
                    "required": false,
                    "type": "Integer"
                },
                "ssa[color_pages]": {
                    "required": false,
                    "type": "String"
                },
                "ssa[score_sheet_id]": {
                    "required": false,
                    "type": "Integer"
                }

    }
}

Я опустил часть json, чтобы сделать его короче.

Что мне нужно, так это иметь массив или ssa, но почему-то не могу сделать это до сих пор. Он создает массив ssa только с одним объектом.

В моем контроллере API у меня есть следующий код:

    optional :ssa, type: Array do
      requires :ss, type: Hash do
        optional :section_name, type: String
        optional :total_pages, type: Integer
        optional :color_pages, type: String
        optional :score_sheet_id, type: Integer
      end
    end

person G.B    schedule 24.06.2014    source источник


Ответы (1)


Я думаю, что у вас есть 2 проблемы здесь. Первый заключается в вашей декларации формы. В коде вы говорите, что у вас есть массив (называемый ssa) хэшей (называемый ss). В своей форме вы отправляете хеш с именем ss1 как часть вашего массива 'ssa'. Хэш ss1 будет проигнорирован, поэтому в вашем массиве будет только один элемент 'ss'.

Если вы переименуете ss1 в ss в своей форме:

ssa[][ss][section_name]   A
ssa[][ss][section_name]   B

вы столкнетесь со второй проблемой, которая заключается в определении контроллера API:

Ваш контроллер ожидает массив «ssa», который может иметь только один хэш-элемент «ss». Таким образом, он перезапишет первый [ss][section_name].

Что вы хотите сделать, так это объявить ssa как массив и удалить группу ss:

requires :ssa, type: Array do
    optional :section_name, type: String
    optional :total_pages, type: Integer
    optional :color_pages, type: String
    optional :score_sheet_id, type: Integer
end

Для этого потребуется массив (ssa) хэшей. Группу ss объявлять не нужно, она уже ожидает массив хэшей с section_name, total_pages и т. д. в качестве ключей. Если ssa не является обязательным параметром, просто объявите его optional, как вы сделали в своем контроллере. Тогда ваша форма должна выглядеть так:

ssa[][section_name]                ABC
opportunity[ssa][][total_pages]    3
ssa[][section_name]                DEF
opportunity[ssa][][total_pages]    6

Это приведет к:

:ssa=>
  [{:section_name=>"DEF",
    :total_pages=>3,
    :color_pages=>nil,
    :score_sheet_id=>nil},
   {:section_name=>"HGJK",
    :total_pages=>6,
    :color_pages=>nil,
    :score_sheet_id=>nil}]
person Mihai Ionescu    schedule 27.06.2014
comment
Вы когда-нибудь пробовали это? - person Andrey; 14.04.2017