Как проверить длину массива с помощью Ruby's Grape?

У меня есть массив элементов, и я хочу убедиться, что он имеет хотя бы один предмет, но не более двух. (своего рода диапазон значений). Предлагает ли Grape какой-нибудь элегантный способ решить проблему проверки длины?

Сейчас у меня такая структура.

params do
  requires :items, type Array[String] # ???
end

Я думаю о написании класс с пользовательской проверкой, который получает максимальное и минимальное значения и сравнивает их с длиной массива.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
870
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пример, объясняющий, как это сделать в Виноград README:

class Length < Grape::Validations::Base
  def validate_param!(attr_name, params)
    unless params[attr_name].length <= @option
      fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long"
    end
  end
end

Вы можете заставить его работать так, как вы ожидаете, с чем-то вроде этого для максимальной длины массива:

class MaxLength < Grape::Validations::Base
  def validate_param!(attr_name, params)
    unless params[attr_name].length <= @option
      fail Grape::Exceptions::Validation, 
      params: [attr_name.to_s],
      message: "must be at the most #{@option} elements long"
    end
  end
end

И это для минимальной длины массива:

class MinLength < Grape::Validations::Base
  def validate_param!(attr_name, params)
    unless params[attr_name].length >= @option
      fail Grape::Exceptions::Validation, 
      params: [attr_name.to_s],
      message: "must be at the least #{@option} elements long"
    end
  end
end

Затем назовите это:

params do
  requires :array, type: Array, min_length: 1, max_length: 2, desc: 'Array with defined length'
end

Другие вопросы по теме