Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用干式类型将逗号分隔值字符串强制转换为数组_Ruby On Rails_Ruby_Virtus - Fatal编程技术网

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

Ruby on rails 使用干式类型将逗号分隔值字符串强制转换为数组,ruby-on-rails,ruby,virtus,Ruby On Rails,Ruby,Virtus,我希望强制表单输入 "1,3,5" 进入: 我正在使用dry类型gem进行其他强制和约束。我需要知道: 这是否可以通过导轨或干式类型中的任何内置机制实现 如果不是,如何使用干式类型为其定义自定义强制 我会考虑两种方法来解决这个问题: 将具有逗号分隔值的字符串转换为数字数组,然后将其馈送到干类型(据我所知,您目前正在做的工作) 为可转换为数组的字符串定义自定义构造类型 您可以修补干燥类型 app/config/initializers/dry_type_patch.rb module D

我希望强制表单输入

"1,3,5"
进入:

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

  • 这是否可以通过导轨干式类型中的任何内置机制实现

  • 如果不是,如何使用干式类型为其定义自定义强制


我会考虑两种方法来解决这个问题:

  • 将具有逗号分隔值的字符串转换为数字数组,然后将其馈送到干类型(据我所知,您目前正在做的工作)
  • 为可转换为数组的字符串定义自定义构造类型

您可以修补干燥类型

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
app/config/initializers/dry_type_patch.rb
模块干燥
模块类型
类数组<定义
类成员<数组
别名old_试试,试试
def try(输入和块)
input=input.split(','),如果input.is_是?(::字符串)
旧的尝试(输入和块)
结束
结束
结束
结束
结束

我使用的是干式验证,即在引擎盖下使用干式类型。您可以使用自定义类型根据需要对其进行转换:

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
#[1,3,5]}错误={}>

这适用于干式验证0.13,但类似的代码也适用于1.0。

是。。。这是我已经在用的。我需要知道是否有更好的方法。很有趣,史蒂夫,但请记住,总有一天OP可能不得不将代码交给其他人。该人员不仅必须(或变得)熟悉
干式类型
,而且还必须了解这种定制,如果OP只使用
arr.split(',').map(&:to_i)
@CarySwoveland我听到了你的意思,但是,使用干类型的coersion特性的全部意义在于,您不必在代码中的任何地方检查目标期望的数据类型以及输入的数据类型。OP不想对每个字段进行测试以检查(a)我们是否需要数组?和(b)输入是字符串吗?。话虽如此,我认为dry-type有一个定制的强制特性,比我的解决方案要好得多。
# 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