Как реализовать гем `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
Другие вопросы по тегам