我希望强制输入表单
"1,3,5"
成:
[1,3,5]
我正在使用dry-types
gem来进行其他强制和约束。我需要知道:
这可以通过 rails 或 dry-types 中的任何内置机制实现吗?
如果没有,如何使用干型为其定义自定义强制?
答案 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)
我考虑两种解决方法:
答案 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。