我尝试用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
实现为一个非常有形式的表单对象,那将非常感激!
答案 0 :(得分:4)
我会尝试在模型级别进行验证。
在初始值设定项中有一个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