如何为葡萄制作一系列物品

时间:2014-06-24 11:11:31

标签: ruby rest parameters grape grape-api

我正在使用Grape Api为rails应用程序构建API。

我现在正在尝试的是这种形式:enter image description here

这是输出:

{
    "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

1 个答案:

答案 0 :(得分:2)

我认为你有2个问题。 第一个在于你的表格声明。 在代码中,您说您有一个哈希数组(称为ssa)(称为ss)。 在您的表单中,您发送了一个名为ss1的哈希,作为您的' ssa的一部分。阵列。 ss1哈希将被忽略,因此您只有一个' s'你的数组中的元素。

如果您在表单中将ss1重命名为ss

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

您将遇到第二个问题,它位于API控制器定义中:

你的控制器需要一个' ssa'数组只能有一个' s'哈希元素。因此,它将覆盖第一个[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_nametotal_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}]