繁体   English   中英

如何使用dry-validation gem验证日期字符串?

[英]How to validate date string with dry-validation gem?

我想允许带有干验证 gem 的日期格式字符串,但我不能。

class NewUserContract < Dry::Validation::Contract
  params do
    optional(:date).filled(:date)
  end
end
contract = NewUserContract.new

contract.call(date: Date.today)
#=> #<Dry::Validation::Result{:date=>Tue, 14 Jan 2020} errors={}>

# I want to allow date formatted string
contract.call(date: '2020-01-20')
#=> #<Dry::Validation::Result{:date=>"2020-01-20"} errors={:date=>["must be a date"]}>

日期格式字符串在 0.13 之前被允许,但从 1.0 开始似乎被禁止。 现在我正在尝试升级我的 Rails 应用程序中的干验证 gem。

编辑

我不知道为什么,但上面的代码现在正在工作。 也许缓存问题? (我记得我运行了bin/rake tmp:cache:clear ,不过)请忽略这个问题。

我检查了dry-validation 1.4.1dry-schema 1.4.3dry-types 1.2.2 ,这很好用:

require 'dry/validation'

class NewUserContract < Dry::Validation::Contract
  params do
    optional(:date).filled(:date)
  end
end
contract = NewUserContract.new

puts contract.call(date: Date.today).inspect
# #<Dry::Validation::Result{:date=>#<Date: 2020-01-14 ((2458863j,0s,0n),+0s,2299161j)>} errors={}>

puts contract.call(date: '2020-01-20').inspect
# #<Dry::Validation::Result{:date=>#<Date: 2020-01-20 ((2458869j,0s,0n),+0s,2299161j)>} errors={}>

我尚未对此进行测试,但我认为您可以使用Type coercion

就像是:

optional(:date).filled(:date?)



注意:为了使用它,您必须启用一些配置。

configure { config.type_specs = true }

此代码适用于干验证 1.4.1!

class NewUserContract < Dry::Validation::Contract
  params do
    optional(:date).filled('params.date')
  end
end
contract = NewUserContract.new

contract.call(date: Date.today)
#=> #<Dry::Validation::Result{:date=>Tue, 14 Jan 2020} errors={}>

contract.call(date: '2020-01-20')
#=> #<Dry::Validation::Result{:date=>Mon, 20 Jan 2020} errors={}>

contract.call(date: 'foo')
#=> #<Dry::Validation::Result{:date=>"foo"} errors={:date=>["must be a date"]}>

'params-date'在这里定义: https : //github.com/dry-rb/dry-types/blob/v1.2.2/lib/dry/types/params.rb#L11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM