2012-10-24 11 views
8

पर तर्क गुजर रहा है मेरे पास एक बहुत ही सामान्य सत्यापनकर्ता है और मैं इसे तर्क देना चाहता हूं।Rails/ActiveModel प्रत्येक वैलिडेटर

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, generic: true #i want to pass argument (order_type) 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, generic: true #i want to pass argument (task_type) 
end 

और उदाहरण सत्यापनकर्ता:

class GenericValidator < ActiveModel::EachValidator 
    def validate_each(object, attribute, value) 
    if some_validation?(object) 
     object.errors[attribute] << (options[:message] || "is not formatted properly") 
    end 
    end 
end 

वहाँ सत्यापनकर्ता पर जो क्षेत्र में यह मान्य है निर्भर करने के लिए तर्क पारित करने के लिए कोई तरीका है

यहाँ एक उदाहरण मॉडल है?

धन्यवाद

+0

क्या आप ऐसा करने से हासिल करने की कोशिश कर रहे हैं? रेलवे एपीआई दिए जाने के लिए यह मुझे सबसे अच्छा तरीका नहीं मानता है। – dpassage

+0

मेरे मूल कोड में मैं यह जानना चाहता हूं कि मेरे मॉडल में चक्रीय निर्भरता है या नहीं। मॉडलए में कई मॉडल बी हैं। मॉडल बी में एक मॉडल ए है। मैं यह सत्यापित करना चाहता हूं कि मॉडल ए से स्वयं कोई चक्र नहीं है। बात यह है कि मेरे पास दो अलग-अलग संबंध हैं जिन्हें चक्रों को सत्यापित करने की आवश्यकता है और उनके बीच सत्यापनकर्ता में बहुत ही कम अंतर है। मैं देखना चाहता था कि क्या मैं इसे सामान्य रूप से चक्रों की तलाश करने के लिए चक्रों की तलाश कर सकता हूं, उसी चक्र तर्क और सत्यापनकर्ता को फिर से लिखने के विपरीत। – GTDev

+0

मुझे लगता है कि आप पैरामीटर के बजाए इसके लिए सबक्लासिंग का उपयोग कर बेहतर हो सकते हैं। – dpassage

उत्तर

13

मैं या तो इस के बारे में पता नहीं था, लेकिन अगर आप एक तर्क पारित करने के लिए चाहते हैं, तो generic: बजाय true के लिए एक हैश गुजरती हैं। options[:order_type] और options[:task_type]:

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, generic: { :order_type => order_type } 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, generic: { :task_type => task_type } 
end 

GenericValidator अब दोनों बहस आप सत्यापन में पारित करने के लिए इच्छुक रहे हैं के लिए उपयोग किया जाना चाहिए: This post सटीक प्रक्रिया का पालन करना चाहते हैं कर रहे हैं विवरण।

इसे और अधिक समझ कर सकता है, हालांकि, इन दो प्रमाणकों में, दोनों के साथ साझा व्यवहार इनहेरिट रूप dpassage ने उल्लेख विभाजित करने के लिए:

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, order: { type: order_type } 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, task: { type: task_type } 
    end 
संबंधित मुद्दे