Как реализовать гем `dry-validation` в объекте формы Rails?
Я пытаюсь заменить ActiveRecord
проверки с Dry-validations
, но я не смог найти никаких примеров реализации в приложении для подражания.
Документы для сухой проверки: http://dry-rb.org/gems/dry-validation/
Я добавил ниже к объекту формы, но я не понимаю, как на самом деле реализовать его, чтобы проверка завершилась неудачно, если title
не вводится в форме пользовательского интерфейса.
schema = Dry::Validation.Schema do
required(:title).filled
end
Форма объекта (настройка с помощью Virtus):
class PositionForm
include Virtus.model
include ActiveModel::Model
require 'dry-validation'
require 'dry/validation/schema/form'
# ATTRIBUTES
attribute :id, Integer
attribute :title, String
...
# OLD ACTIVE RECORD VALIDATIONS
#validates :title, presence: true
# NEW DRY VALIDATIONS
schema = Dry::Validation.Schema do
required(:title).filled
end
def save
if valid?
persist!
true
else
false
end
end
def persist!
@position = Position.create!(title: title...)
end
end
Я никогда не использовал dry-validation
раньше - любое руководство будет очень ценным!
ОБНОВИТЬ
Я был в состоянии "заставить это работать", но это все еще не похоже на правильный шаблон дизайна.
Обновлен метод сохранения
def save
schema = Dry::Validation.Schema do
required(:title).filled
end
errors = schema.(title: title)
if valid? && errors.messages.empty?
persist!
true
else
false
end
end
Если кто-то может поделиться руководством по подходящей схеме проектирования для реализации dry-validation
в объект формы в стиле виртууса это было бы очень важно!
1 ответ
Я бы попытался сохранить валидацию на уровне модели.
Имейте модель ModelValidations в ваших инициализаторах, каждый метод назван в честь модели, которую он проверяет.
конфигурации / инициализации / model_validations.rb
module ModelValidations
def position_form
Dry::Validation.Schema do
required(:title).filled
end
end
end
В модели вызовите модуль dry_validation для этой модели.
приложение / модели /position_form.rb
class PositionForm
validates :dry_validation
def dry_validation
ModelValidations.position_form(attributes).each do |field, message|
errors.add(field, message)
end
end
end