使用 DryValidations 验证查询参数时缺少模块

Missing Module when using DryValidations to validate query params

我有一个 jsonapi 端点,我在其中获取查询参数 "include",其中有几个对象由“,”分隔,
现在,我使用 Dry::Validations 验证我的参数,并希望对该字段进行预处理,以便获得一个字符串数组。 为了实现这个,我根据文档做了这个:

module CustomTypes
  include Dry::Types.module

  IncludeRelatedObject = Types::String.constructor do |itm|
    itm.split(',')&.map :chomp
  end
end

现在,当我 运行 我的测试时,我得到这个错误:

Failure/Error: IncludeRelatedObject = Types::String.constructor do |itm| itm.split(',')&.map :chomp end

NameError: uninitialized constant CustomTypes::Types

这是我的验证:

Dry::Validation.Params do
  configure do
    config.type_specs = true
  end
  optional(:include, CustomTypes::IncludeRelatedObject).each { :filled? & :str? }
end

知道我的代码有什么问题吗?

要为验证定义自定义类型,您应该使用类型模块。所以你应该将模块名称从 CustomTypes 更改为 Types.

module Types
  include Dry::Types.module

  IncludeRelatedObject = Types::String.constructor do |itm|
    itm.split(',')&.map :chomp
  end
end

include Dry::Types.module 基本上是将常量变形到它所包含的模块中。你有 CustomTypes::String 等等,这是你的自定义类型中应该引用的内容:

module CustomTypes
  include Dry::Types.module

  # IncludeRelatedObject = Types::String.constructor do |itm|
  IncludeRelatedObject = CustomTypes::String.constructor do |itm|
    itm.split(',').map(&:chomp)
  end
end