ruby-on-rails - 带有验证助手的自定义验证器

标签 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

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

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

建议??

最佳答案

我设法使用 SimpleDelegator 类解决了这个问题。

  • 首先,我从 SimpleDelegator 继承了 PublishableValidator
  • PublishableValidator 对象委托(delegate)给 @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

关于ruby-on-rails - 带有验证助手的自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194327/

相关文章:

ruby-on-rails - Mongoid/Mongodb 和查询嵌入文档

ruby-on-rails - Rails 应用程序如何知道在哪里提取 ENV 变量?

ruby - 如何使用 Mongoid 按嵌套字段值排序?

ruby-on-rails - 将密码作为环境变量(而不是纯文本)存储在配置文件中是否安全?

java - 无需特定 XSD 即可验证 XML

html - 什么是过时的元 http-equiv=content-language 的 HTML5 替代品。

c# - 我的验证器都不起作用

ruby-on-rails - 不返回任何内容的 Mongoid 标准

mysql2 gem 与 mysql 5.6.19 不兼容

javascript - rails 部分渲染 html 不运行 javascript