带有验证助手的自定义验证器

Custom validator with validation helpers in it

我定义了一个 class,由于其中定义了很多验证,它变得 fat。因此,我创建了一个自定义验证器,其中包括特定于给定上下文的所有验证,并且工作正常。

但问题是,在 验证任何属性 时,未考虑在定义验证时传递的 选项 .

考虑这个 Post class,

class Post
  include Mongoid::Document

  field :state
  field :description

  validates_with PublishableValidator, on: :publish
end

现在,在发布 post 时,它的描述是强制性的。所以我用 publish context.

验证它
@post.valid?(:publish)

所有可发布验证的自定义验证器定义为,

class PublishableValidator < ActiveModel::Validator
  include ActiveModel::Validations

  validates :description, presence: true, unless: :admin?

  def validate(post)
    self.class.validators.each do |validator|
      validator.validate(post)
    end
  end
end

现在,描述验证中存在限制,对于管理员,不要运行此验证(这不是个好主意,但管理员可以为所欲为:]).

但是当我用空白的描述和管理员权限验证它时,它仍然报错,没有考虑提供的约束。

建议 ??

我设法通过使用 SimpleDelegator class.

解决了它
  • 首先,我从SimpleDelegator继承了PublishableValidator
  • 已将 PublishableValidator 对象委托给 @post
  • 运行 对可发布对象的验证。
  • 最后,将可发布的错误合并到 post 对象。

已更新PublishableValidator

class PublishableValidator < SimpleDelegator
  include ActiveModel::Validations

  validates :description, presence: true, unless: :admin?

  def validate(post)
    self.__setobj__(post)
    super

    post.errors.messages.merge!(self.errors.messages)
  end
end

多亏了这个blog