मैं अपने रेल ऐप में नेस्टेड विशेषताओं के सत्यापन करने के लिए कुछ घंटों से संघर्ष कर रहा हूं। एक छोटी सी चेतावनी यह है कि मुझे अपने माता-पिता के गुणों के आधार पर गतिशील रूप से नेस्टेड विशेषताओं को सत्यापित करना होगा, क्योंकि माता-पिता की प्रक्रिया में कहां से अधिक समय में परिवर्तन की आवश्यकता होती है।रेलवे 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
किसी कारण से कौन सा समस्याओं को जन्म देता मैं ऊपर था। मेरे उदाहरण कोड का परीक्षण करने और रिपोर्टिंग के लिए धन्यवाद संतोष काम कर रहा था, इसने मुझे यह समझने के लिए सही दिशा में इंगित किया।
भविष्य के संदर्भ के लिए, मूल प्रश्न में कोड इस तरह के गतिशील, गहराई से घिरे सत्यापन के लिए काम करता है।
अपने कोड में कुछ त्रुटियां नहीं हैं। यह टाइपो हो सकता है। 1. 'बाल मूल्य खाली नहीं हो सकता है' - सिंगल कोट के अंदर एकल उद्धरण। 2. && parent.status = 'validate_children' - यह तुलना नहीं है। इसके असाइनमेंट –
टाइपो के बारे में खेद है! यहां कोड मेरे ऐप का एक सरलीकृत उदाहरण है, इसलिए यह काम नहीं कर रहा है, लेकिन यह इंगित करने के लिए धन्यवाद :) –