Приведение строки значений через запятую в массив с использованием dry-types
Я хочу привести форму ввода
"1,3,5"
в:
[1,3,5]
я использую dry-types
драгоценный камень для других принуждений и ограничений. Мне нужно знать:
Это возможно с помощью любого встроенного механизма в рельсах или сухих типах?
Если нет, то как мне определить пользовательское принуждение для него с использованием dry-types?
2 ответа
Вы можете патч сухих типов
app/config/initializers/dry_type_patch.rb
module Dry
module Types
class Array < Definition
class Member < Array
alias old_try, try
def try(input, &block)
input = input.split(',') if input.is_a?(::String)
old_try(input, &block)
end
end
end
end
end
Я хотел бы рассмотреть два способа решения этой проблемы:
- преобразование строки со значениями, разделенными запятыми, в массив чисел, а затем передача ее в сухие типы (что, насколько я понимаю, вы делаете в настоящее время)
- Определите пользовательский тип конструкции для такой строки, которая может быть преобразована в массив. Вот статья об этом
Я использовал сухую валидацию, которая использует сухие типы под капотом. Вы можете предварительно обработать ввод, используя настраиваемый тип, который преобразует его по вашему желанию:
NumberArrayAsString =
Dry::Types::Definition
.new(Array)
.constructor { |input| input.split(',').map { |v| Integer(v) } }
В полном контексте с использованием сухой проверки:
# frozen_string_literal: true
require 'dry-validation'
NumberArrayAsString =
Dry::Types::Definition
.new(Array)
.constructor { |input| input.split(',').map { |v| Integer(v) } }
ExampleContract = Dry::Validation.Params do
configure do
config.type_specs = true
end
required(:ids, NumberArrayAsString)
end
puts ExampleContract.call(ids: '1,3,5').inspect
#<Dry::Validation::Result output={:ids=>[1, 3, 5]} errors={}>
Это работает с сухой проверкой 0.13, но аналогичный код должен работать и для 1.0.