Пользовательский валидатор ActiveModel Ruby

Я хотел бы написать собственный валидатор для данного вызова валидации:

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 
  • параметры [: включение] = [: готово,: активно]
  • запись - это экземпляр Worker (я думаю ...)
  • значение Понятия не имею (value = record.graph_object?)
  • атрибут то же, что и для значения - понятия не имею

Может быть, validates :graph_object, graph_object_type: {inclusion: [:ready, :active]} неправильно определен?


person Kocur4d    schedule 27.09.2015    source источник


Ответы (1)


ОК, думаю, разобрался - люблю ставит отладку! Кому надо любопытствовать!

Один из способов сделать это:

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
  • value: экземпляр GraphObject
  • атрибут: :graph_object символ
person Kocur4d    schedule 27.09.2015