2013-04-23 3 views
5

मैं अपने रेल ऐप में नेस्टेड विशेषताओं के सत्यापन करने के लिए कुछ घंटों से संघर्ष कर रहा हूं। एक छोटी सी चेतावनी यह है कि मुझे अपने माता-पिता के गुणों के आधार पर गतिशील रूप से नेस्टेड विशेषताओं को सत्यापित करना होगा, क्योंकि माता-पिता की प्रक्रिया में कहां से अधिक समय में परिवर्तन की आवश्यकता होती है।रेलवे Accepts_nested_attributes_ लेनदेन संबंधी ऑब्जेक्ट पर सत्यापन के लिए

तो मेरा सेटअप यहां है: मेरे पास कई अलग-अलग संबंधित मॉडल के साथ एक अभिभावक है और मैं माता-पिता को सहेजने के दौरान उन लोगों के बाद के नेस्टेड विशेषताओं को सत्यापित करना चाहता हूं।

class Parent < ActiveRecord::Base 
    attr_accessible :children_attributes, :status 
    has_many :children 
    accepts_nested_attributes_for :children 
    validate :validate_nested_attributes 
    def validate_nested_attributes 
    children.each do |child| 
     child.descriptions.each do |description| 
     errors.add(:base, "Child description value cant be blank") if description.value.blank? && parent.status == 'validate_children' 
     end 
    end 
    end 
end 


class Child < ActiveRecord::Base 
    attr_accessible :descriptions_attributes, :status 
    has_many :descriptions 
    belongs_to :parent 
    accepts_nested_attributes_for :descriptions 
end 

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

यहाँ इस परिदृश्य की एक त्वरित उदाहरण है:

parent = Parent.create({:status => 'validate_children', :children_attributes => {0 => {:descriptions_attributes => { 0 => {:value => 'Not blank!'}}}}) 
    #true 
parent.update_attributes({:children_attributes => {0 => {:descriptions_attributes => { 0 => {:value => nil}}}}) 
    #true!!/since child.value.blank? reads the database and returns false 
parent.update_attributes({:children_attributes => {0 => {:descriptions_attributes => { 0 => {:value => 'Not blank!'}}}}) 
    #false, same reason as above 

सत्यापन प्रथम स्तर संघों, उदा लिए काम करता है अगर किसी बच्चे के पास 'मूल्य' विशेषता है, तो मैं एक सत्यापन को चला सकता हूं जिस तरह से मैं करता हूं। समस्या गहरे संघों के साथ है जो स्पष्ट रूप से सहेजने से पहले मान्य नहीं की जा सकती हैं।

क्या कोई मुझे इसे हल करने के सही दिशा में इंगित कर सकता है? एकमात्र तरीका जो मैं वर्तमान में देखता हूं वह है रिकॉर्ड को सहेजकर, उन्हें बाद में सत्यापित करना और सत्यापन विफल होने पर उन्हें हटाना/हटाना, लेकिन मैं ईमानदारी से कुछ और साफ करने की उम्मीद कर रहा हूं।

सभी को अग्रिम धन्यवाद!

समाधान

तो यह पता चला है मैं उन सीधे कस्टम सत्यापन में संदर्भित द्वारा गहरी नेस्टेड मॉडल पर सत्यापन चल रहा था, इस तरह से:

class Parent < ActiveRecord::Base 
    [...] 
    has_many :descriptions, :through => :children 
    [...] 
    def validate_nested_attributes 
    descriptions.each do |description| 
     [...] 
    end 
    end 
end 

किसी कारण से कौन सा समस्याओं को जन्म देता मैं ऊपर था। मेरे उदाहरण कोड का परीक्षण करने और रिपोर्टिंग के लिए धन्यवाद संतोष काम कर रहा था, इसने मुझे यह समझने के लिए सही दिशा में इंगित किया।

भविष्य के संदर्भ के लिए, मूल प्रश्न में कोड इस तरह के गतिशील, गहराई से घिरे सत्यापन के लिए काम करता है।

+0

अपने कोड में कुछ त्रुटियां नहीं हैं। यह टाइपो हो सकता है। 1. 'बाल मूल्य खाली नहीं हो सकता है' - सिंगल कोट के अंदर एकल उद्धरण। 2. && parent.status = 'validate_children' - यह तुलना नहीं है। इसके असाइनमेंट –

+0

टाइपो के बारे में खेद है! यहां कोड मेरे ऐप का एक सरलीकृत उदाहरण है, इसलिए यह काम नहीं कर रहा है, लेकिन यह इंगित करने के लिए धन्यवाद :) –

उत्तर

2

मुझे लगता है कि आप बच्चे में निम्नलिखित मान्यता के साथ इस

के लिए validates_associated का उपयोग करना चाहिए

validates :value, :presence => true, :if => "self.parent.status == 'validate_children'" 
+0

हाय संतोष, बहुत तेज़ उत्तर के लिए धन्यवाद! मैं पहले से ही validates_associated में कदम रखा है, लेकिन यहां के आसपास सामान्य भावना यह है कि यह किसी भी चीज़ से परेशानी का अधिक है। क्या उनके खुद के मॉडल को छूए बिना माता-पिता के मॉडल से संबंधित रिकॉर्ड विशेषताओं को सत्यापित करने का कोई तरीका है?इसकी आवश्यकता होगी क्योंकि, मेरे सेटअप में, बच्चे बिना किसी मूल्य के डेटाबेस में रह सकता है, लेकिन केवल तभी जब माता-पिता की स्थिति 'validate_children' से अलग होती है। –

+0

उस स्थिति में, आप इस तरह के बच्चों में सत्यापन जोड़ सकते हैं: मान्य: मान,: उपस्थिति => सत्य,: if => "self.parent.status == 'validate_children'" –

+0

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

संबंधित मुद्दे