【问题标题】:Coercion of comma separated values string into array using dry-types使用干类型将逗号分隔值字符串强制转换为数组
【发布时间】:2017-07-23 17:36:22
【问题描述】:

我希望强制表单输入

"1,3,5"

进入:

[1,3,5]

我将dry-types gem 用于其他强制和约束。我需要知道:

  • 这是否可以通过 railsdry-types 中的任何内置机制实现?

  • 如果不是,我如何使用 dry-types 为其定义自定义强制转换?

【问题讨论】:

  • 是的......这就是我已经在使用的。我需要知道是否有更好的方法。

标签: ruby-on-rails ruby virtus


【解决方案1】:

我会考虑两种解决方法:

  • 将具有逗号分隔值的字符串转换为数字数组,然后将其提供给干类型(据我了解,您目前正在做什么)
  • 为此类可转换为数组here's an article about it 的字符串定义自定义构造类型

【讨论】:

    【解决方案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
    

    【讨论】:

    • 有趣,史蒂夫,但请记住,有一天 OP 可能不得不将代码交给其他人。该人不仅必须(或变得)熟悉dry-types,而且他们还必须了解这种定制,如果 OP 只使用 arr.split(',').map(&amp;:to_i),这将是不必要的。
    • @CarySwoveland 我听到你在说什么,但是使用干类型的强制转换特性的全部意义在于,你不必在代码中到处检查目标是什么数据类型期望以及输入的数据类型。 OP 不想对每个字段进行测试以检查 (a) 我们是否需要一个数组? (b) 输入是字符串吗?话虽如此,我认为 dry-type 具有自定义强制功能,这将比我的解决方案更好。
    【解决方案3】:

    我使用的是干式验证,它在引擎盖下使用干式。您可以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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多