使用干式将逗号分隔值字符串强制转换为数组

时间:2017-07-23 17:36:23

标签: ruby-on-rails ruby virtus

我希望强制输入表单

"1,3,5"

成:

[1,3,5]

我正在使用dry-types gem来进行其他强制和约束。我需要知道:

  • 这可以通过 rails dry-types 中的任何内置机制实现吗?

  • 如果没有,如何使用干型为其定义自定义强制?

3 个答案:

答案 0 :(得分:4)

你可以修补干型

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

答案 1 :(得分:3)

我考虑两种解决方法:

  • 将带逗号分隔值的字符串转换为数字数组,然后将其提供给干型(据我所知,目前正在做的事情)
  • 为此类字符串定义自定义构造类型,该字符串可转换为数组here's an article about it

答案 2 :(得分:0)

我正在使用干燥验证,该验证使用引擎盖下的干燥类型。您可以pre-process the input使用自定义类型,该类型可以根据需要进行转换:

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。