【问题标题】:How to implement `dry-validation` gem in a Rails form object?如何在 Rails 表单对象中实现“dry-validation”gem?
【发布时间】:2016-09-21 02:41:23
【问题描述】:

我正在尝试将 ActiveRecord 验证替换为 Dry-validations,但我找不到任何应用内实现示例可遵循。

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

我已在表单对象中添加了以下内容,但我不明白如何实际实现它,因此如果未在 UI 的表单中输入 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 实现为 virtus 样式表单对象的适当设计模式的指导,我们将非常感激!

【问题讨论】:

    标签: ruby-on-rails validation virtus


    【解决方案1】:

    我会尝试在模型级别保持验证。

    在您的初始化程序中有一个 ModelValidations 模型,每个方法都以其验证的模型命名。

    config/initialize/model_validations.rb

    module ModelValidations
      def position_form
        Dry::Validation.Schema do
          required(:title).filled
        end
      end
    end
    

    在模型中,为该模型调用dry_validation模块。

    app/models/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
    

    【讨论】:

    • /initializers 比普通的/models 更可取吗?
    • 当然,我们使用的是常规模型,但我们需要在某个地方定义模块,而初始化程序就是一个地方。 class PositionForm/models 中,但碰巧使用了在初始化程序中定义的干式验证。我将修改答案以明确PositionForm 仍在模型目录中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多