【问题标题】:Custom validator with validation helpers in it带有验证助手的自定义验证器
【发布时间】:2016-05-13 16:04:36
【问题描述】:

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

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

考虑这个Post 类,

class Post
  include Mongoid::Document

  field :state
  field :description

  validates_with PublishableValidator, on: :publish
end

现在,在发布帖子时,必须对其进行描述。所以我用 publish 上下文验证它。

@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

现在,description 验证中有一个限制,对于管理员来说,不要运行此验证(这不是一个好主意,但管理员可以为所欲为:])。

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

建议??

【问题讨论】:

    标签: ruby-on-rails validation mongoid activemodel


    【解决方案1】:

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

    • 首先,我从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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多