ruby-on-rails - 通过扩展向 ActiveRecord 模块添加自定义验证?

标签 ruby-on-rails ruby-on-rails-3 validation module

我正在尝试将验证移至模块。我想将现有对象扩展为一组验证器,但我正在努力弄清楚如何让它们执行。有任何想法吗?

事件记录对象

class Test < ActiveRecord::Base
  has_many :resources
end

验证器
module TestValidator
  extend ActiveSupport::Concern

  included do
    validates_associated :resources
  end
end

安慰
t = Test.new
t.extend TestValidator
t.valid?
# true ... should be false

最佳答案

我希望这可以帮助

6.1 自定义验证器
自定义验证器是扩展 ActiveModel::Validator 的类。这些类必须实现一个 validate 方法,该方法将记录作为参数并对其执行验证。使用 validates_with 方法调用自定义验证器。

class MyValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'X'
      record.errors[:name] << 'Need a name starting with X please!'
    end
  end
end



class Person
  include ActiveModel::Validations
  validates_with MyValidator
end

添加自定义验证器以验证单个属性的最简单方法是使用方便的 ActiveModel::EachValidator。在这种情况下,自定义验证器类必须实现一个 validate_each 方法,该方法接受三个参数:对应于实例的记录、属性和值、要验证的属性和传递的实例中的属性值。
class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end

class Person < ActiveRecord::Base
  validates :email, :presence => true, :email => true
end

如示例中所示,您还可以将标准验证与您自己的自定义验证器结合起来。

https://guides.rubyonrails.org/active_record_validations.html#custom-validators

关于ruby-on-rails - 通过扩展向 ActiveRecord 模块添加自定义验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026878/

相关文章:

ruby-on-rails - ruby /rails 。将变量传递给参数

javascript - 有效日期作为无效日期 Javascript 的输出

html - 使用 CSS 进行输入限制或验证

ruby-on-rails - 在一个 Action 中渲染不同的 View

ruby - 如何在 ruby​​ on rails 中显示 Datatable tabletools (copy, csv, excel, pdf, save)

ruby-on-rails - 验证失败时重新加载回形针文件上传

python - django打印模板中的表单错误

ruby-on-rails - 目录 : Elasticsearch sort by mapped field

ruby-on-rails - 可以在elasticsearch-rails中使用copy_to吗?

ruby-on-rails - 我将如何访问 Mailer Preview 中的 url 参数