首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dry-validation在Ruby中创建嵌套/可重用的验证器

使用dry-validation在Ruby中创建嵌套/可重用的验证器
EN

Stack Overflow用户
提问于 2021-03-29 21:57:50
回答 1查看 179关注 0票数 0

比方说,我想要为地址设置一个验证协定,然后我还想为用户和咖啡店设置一个验证器;这两者都包括一个地址,是否可以在UserContractCoffeeShopContract中重用AddressContract

例如,我想要验证的数据可能如下所示:

代码语言:javascript
复制
# Address
{
    "first_line": "100 Main street",
    "zipcode": "12345",
}

# User
{
    "first_name": "Joe",
    "last_name": "Bloggs",
    "address:" {
        "first_line": "123 Boulevard",
        "zipcode": "12346",
    }
}

# Coffee Shop
{
    "shop": "Central Perk",
    "floor_space": "2000sqm",
    "address:" {
        "first_line": "126 Boulevard",
        "zipcode": "12347",
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 23:12:05

是的,您可以重用模式(请参阅:Reusing Schemas)

它看起来像这样:

代码语言:javascript
复制
require 'dry/validation'
class AddressContract < Dry::Validation::Contract 
  params do 
    required(:first_line).value(:string) 
    required(:zipcode).value(:string) 
  end
end

class UserContract < Dry::Validation::Contract 
  params do
    required(:first_name).value(:string)
    required(:last_name).value(:string)
    required(:address).schema(AddressContract.schema)
  end
end 


a = {first_line: '123 Street Rd'}
u = {first_name: 'engineers', last_name: 'mnky', address: a }

AddressContract.new.(a)
#=> #<Dry::Validation::Result{:first_line=>"123 Street Rd"} errors={:zipcode=>["is missing"]}>
UserContract.new.(u)
#=> #<Dry::Validation::Result{:first_name=>"engineers", :last_name=>"mnky", :address=>{:first_line=>"123 Street Rd"}} errors={:address=>{:zipcode=>["is missing"]}}>

或者,您也可以创建模式混合,例如

代码语言:javascript
复制
AddressSchema = Dry::Schema.Params do 
  required(:first_line).value(:string) 
  required(:zipcode).value(:string) 
end 

class AddressContract < Dry::Validation::Contract 
    params(AddressSchema) 
end

class UserContract < Dry::Validation::Contract 
  params do
    required(:first_name).value(:string)
    required(:last_name).value(:string)
    required(:address).schema(AddressSchema)
  end
end 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66855573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档