У меня есть массив элементов, и я хочу убедиться, что он имеет хотя бы один предмет, но не более двух. (своего рода диапазон значений). Предлагает ли Grape какой-нибудь элегантный способ решить проблему проверки длины?
Сейчас у меня такая структура.
params do
requires :items, type Array[String] # ???
end
Я думаю о написании класс с пользовательской проверкой, который получает максимальное и минимальное значения и сравнивает их с длиной массива.

Пример, объясняющий, как это сделать в Виноград 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