我正在尝试用 ActiveRecord 替换 Dry-validations 验证,但我一直无法找到任何要遵循的应用内实现示例。

干验证文档:http://dry-rb.org/gems/dry-validation/

我在下面添加了表单对象,但我不明白如何实际实现它,因此如果 title 未在 UI 表单中输入,则验证失败。

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 实现为 virtus 样式表单对象的适当设计模式的指南,将不胜感激!

最佳答案

我会尽量保持模型级别的验证。

在初始化器中有一个 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

关于ruby-on-rails - 如何在 Rails 表单对象中实现 `dry-validation` gem?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39606680/

10-13 04:45