Приведение строки значений через запятую в массив с использованием 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.

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