Как проверить строку даты с помощью камня сухой проверки?
Я хочу разрешить форматированную строку даты с гемом сухой проверки, но я не могу.
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.
РЕДАКТИРОВАТЬ
Я не знаю почему, но приведенный выше код сейчас работает. Может проблема с кешированием? (Я помню, что сбежалbin/rake tmp:cache:clear
хотя) Пожалуйста, проигнорируйте этот вопрос.
3 ответа
Я проверил с dry-validation 1.4.1
, dry-schema 1.4.3
а также dry-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={}>
Я не тестировал это, но думаю, вы можете использовать приведение типа.
что-то типа:
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