自定义ActiveModel Validator Ruby

时间:2015-09-27 12:40:16

标签: ruby validation activemodel

我想为给定的验证调用编写自定义验证器:

class Worker
  include ActiveModel::Validations  

  def initialize(graph_object)
    @graph_object = graph_object
  end

  attr_accessor :graph_object

  validates :graph_object, graph_object_type: {inclusion: [:ready, :active]}
end

class GraphObject
  attr_accessor :state     
end

我想根据Worker#graph_object验证GraphObject#state。因此,当Worker传入:准备好:有效状态时,GrapObject有效。我想尽可能多地重用ActiveModel。

验证文档描述了设置自定义验证器的过程,但我无法弄清楚如何操作。

我想我必须从这开始:

class GraphObjectTypeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
  end
end 
  • 选项[:包含] = [:ready,:active]
  • 记录是工人的实例(我认为......)
  • 我不知道(value = record.graph_object?)
  • 属性与值相同 - 不知道

可能validates :graph_object, graph_object_type: {inclusion: [:ready, :active]}未正确定义?

1 个答案:

答案 0 :(得分:2)

好吧,我想我想出来了 - 我喜欢调试!谁需要撬!

这样做的一种方法是:

class GraphObjectTypeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if options.key?(:inclusion) && not_included?(value.type)
      record.errors.add(attribute, "wrong graph object type")
    end
  end

private

  def not_included?(type)
    !options[:inclusion].include?(type)
  end
end
  • 选项[:包含]: [:ready, :active]数组
  • 记录 Worker
  • 的实例
  • GraphObject
  • 的实例
  • 属性: :graph_object符号