自定义验证器,其中包含验证助手

时间:2016-02-04 06:49:55

标签: ruby-on-rails validation mongoid activemodel

我已经定义了一个,因为它中定义了许多验证,因此。因此,我创建了一个自定义验证器,其中包含特定于给定上下文的所有验证,并且它工作正常。

但问题是,虽然验证任何属性,但在定义验证时传递的选项并未得到考虑。

考虑这个Post类,

class Post
  include Mongoid::Document

  field :state
  field :description

  validates_with PublishableValidator, on: :publish
end

现在,在发布帖子时,其描述是强制性的。所以我使用发布上下文来验证它。

@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

现在,描述验证存在限制,对于管理员来说,不要运行此验证(不是一个好主意,但管理员可以做任何他们想做的事情:])。

但是当我使用空白描述和管理员权限验证它时,它仍会出错,而不考虑提供的约束。

建议??

1 个答案:

答案 0 :(得分:1)

我设法使用SimpleDelegator类来解决它。

  • 首先,我从PublishableValidator继承了SimpleDelegator
  • 委派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