簡體   English   中英

如何在Rails表單對象中實現`dry-validation` gem?

[英]How to implement `dry-validation` gem in a Rails form object?

我試圖用Dry-validations替換ActiveRecord驗證,但我一直無法找到任何應​​用內實現示例。

干驗證文檔: 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 - 任何指導都會受到超級贊賞!


UPDATE

我已經能夠“讓它工作”,但它仍然不像正確的設計模式。

更新了保存方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM