Как определить массив хэшей в Grape?

Я использую Ember в качестве внешнего интерфейса и Grape API для обслуживания своего API.

Внешний интерфейс отправляет что-то вроде:

{
  "service"=>{
    "name"=>"Name",
    "duration"=>"30",
    "user"=>nil,
    "organization"=>"org",
    "category"=>nil,
    "description"=>"description",
    "disabled"=>true,
    "color"=>nil,
    "availabilities"=>[
      {
        "day"=>"Saturday",
        "enabled"=>false,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      },
      {
        "day"=>"Sunday",
        "enabled"=>false,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      },
      {
        "day"=>"Monday",
        "enabled"=>true,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          },
          {
            "startAt"=>"05:00 AM",
            "endAt"=>"09:00 PM"
          },
          {
            "startAt"=>"05:00 AM",
            "endAt"=>"09:00 PM"
          }
        ]
      },
      {
        "day"=>"Tuesday",
        "enabled"=>true,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      },
      {
        "day"=>"Wednesday",
        "enabled"=>true,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      },
      {
        "day"=>"Thursday",
        "enabled"=>true,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      },
      {
        "day"=>"Friday",
        "enabled"=>true,
        "timeSlots"=>[
          {
            "startAt"=>"09:00 AM",
            "endAt"=>"05:00 PM"
          }
        ]
      }
    ]
  }
}

И я изо всех сил пытаюсь реализовать интерфейс API Grape для получения полезной нагрузки, в итоге я получил что-то вроде:

  resource :services do
    params do
      requires :service, type: Hash do
        requires :name, type: String
        requires :organization, type: String
        requires :duration, type: Integer
        requires :category, type: String
        optional :color, type: String
        optional :description, type: String
        optional :disabled, type: Boolean
        requires :availabilities, type: Array do
          requires :day, type: String
          optional :enabled, type: Boolean
          optional :timeSlots, type: Array do
            requires :startAt, type: Time
            requires :endtAt, type: Time
          end
        end
      end
    end
    post do
      puts params
    end
  end

Но не повезло, так как я получаю следующую ошибку:

ERROR -- service[availabilities][0][timeSlots][0][endtAt] is missing

person Eki Eqbal    schedule 08.06.2016    source источник


Ответы (2)


Вы можете попробовать использовать «группу», чтобы указать тип ваших элементов массива.

Пример (обновлено):

params do
  group :services, type: Array, desc: "An array of services" do
    requires :name, type: String
    requires :organization, type: String
    requires :duration, type: Integer
    ...
  end
end
put '/test' do
  s = []
  params[:services].each do |service|
    s << service
  end
  return s
end
person massinissa    schedule 10.06.2016
comment
и как ввести в поле say :name? как я могу дать ему несколько значений? - person Muhammad Faisal Iqbal; 24.11.2016

С ответом от @massinissa я смог заставить работать все следующее:

params do
  group :rules, type: Array do
    requires :rule_id, type: String
    requires :rule_content, type: String
  end
end

params do
  requires :rules, type: Array do
    requires :rule_id, type: String
    requires :rule_content, type: String
  end
end

params do
  requires :rules, type: Array[Hash]
end

Однако по умолчанию функция JQuery ajax отправляет данные в виде строки запроса в формате, который Grape не может понять. Поэтому мне пришлось установить contentType = 'application/json' и использовать

`data = JSON.stringify({rules: [{rule_id: '1', rule_content: 'blah'}]})`
person Marlin Pierce    schedule 13.02.2018