2015-09-27 78 views
2

我想編寫一個自定義驗證對於給定的驗證電話:加載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 

我想根據GraphObject#state驗證Worker#graph_object。因此WorkerGrapObject中的傳遞位於:ready:active狀態時有效。我想盡可能多地重用ActiveModel。

驗證文檔介紹了設置自定義驗證程序的過程,但我無法弄清楚如何執行此操作。

我想我要開始這樣的:

class GraphObjectTypeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    end 
end 
  • 選項[:列入] = [:準備好了,:主動]
  • 記錄是工人的實例(我想...)
  • value我不知道(是value = record.graph_object?)
  • 屬性相同價值 - 不知道

也許validates :graph_object, graph_object_type: {inclusion: [:ready, :active]}沒有定義吧?

回答

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符號