2013-05-22 3 views
7

मेरे पास बुलेटिन के लिए मेरे रेल ऐप में एक मॉडल है, और जब इसे बनाया जाता है, तो डेटाबेस में कई मानों को क्रमशः एक्सेस किए जाने के लिए क्रमबद्ध हैश या सरणी के रूप में संग्रहीत किया जाता है। मैं केवल उन हैंशों में से एक के लिए एक संपादन दृश्य बनाने की कोशिश कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि इसे मेरे रूप में कैसे पहुंचाया जाए।Rails serialized हैश को एक रूप में कैसे संपादित करें?

हैश इस तरह दिखता है जब संग्रहीत:

top_offices = { first_office: "Office Name", first_office_amount: 1234.50, 
second_office: "Office Name", second_office_amount: 1234.50 } 

और इसी तरह ... वहाँ पाँच कार्यालय हैं।

तो कंसोल में मैं ऐसा करके मान संपादित कर सकते हैं:

bulletin = Bulletin.last 
bulletin.top_offices[:first_office] = "New Office" 
bulletin.top_offices[:first_office_amount] = 1234.00 
bulletin.save 

मैं समझ नहीं कैसे एक रूप है कि मुझे ठीक से उन मूल्यों को आवंटित करने के लिए अनुमति देता है बनाने के लिए। मुझे वास्तव में पहले से संग्रहीत मूल्यों के साथ पॉप्युलेट करने की आवश्यकता भी नहीं है क्योंकि जब भी मैं फॉर्म का उपयोग करता हूं, मैं उन्हें पूरी तरह से बदल रहा हूं।

उत्तर

8

विकल्प 1: सिंगल उदाहरण विधि धारावाहिक विशेषता को अपडेट करने

जहां तक ​​मैं जानता हूँ कि यह एक धारावाहिक विशेषता एक रूप से सीधे संपादित करने के लिए संभव नहीं है।

जब मेरे पास इस तरह की चीजें हैं, तो मैं हमेशा मॉडल में एक उदाहरण विधि बना रहा हूं जो पैरा प्राप्त करता है और अद्यतन करता है (यदि मैं बैंग (!) के साथ विधि नाम समाप्त करता हूं तो सहेज भी सकता है)।

आपके मामले में मैं निम्नलिखित करना होगा:

class Bulletin 

    ... 

    def update_top_offices!(params) 
    params.each do |key, value| 
     self.top_offices[key] = value 
    end 

    self.save 
    end 

    ... 
end 

विकल्प 2: धारावाहिक विशेषता कुंजी

प्रति एक गेटर/सेटर इसके अलावा एक और संभावना यदि आप वास्तव में धारावाहिक अद्यतन करने के लिए एक फार्म का उपयोग करना चाहते विशेषता निम्न के रूप में एक गेटर/सेटर बनाने के लिए है:

class Bulletin 

    ... 

    def first_office 
    self.top_offices[:first_office] 
    end 

    def first_office=(value) 
    self.top_offices[:first_office] = value 
    end 

    ... 
end 

लेकिन फिर अद्यतन मूल्यों को सहेजना न भूलें।

विकल्प 3: अधिभावी method_missing

एक आखिरी संभावना method_missing ओवरराइड करने के लिए है, लेकिन यह थोड़ा और अधिक जटिल है।

+0

ठीक है। मुझे लगता है कि मैं इसे विकल्प का उपयोग करके समझने में सक्षम हूं। मैं शायद दूसरे दृष्टिकोण को पसंद करता हूं लेकिन मैं यह नहीं समझ सकता कि यह मेरे सिर में कैसे काम करता है। मैं फॉर्म में उन तरीकों का उपयोग कैसे करूं? क्या मैं सिर्फ 'form_tag' और कुछ 'text_field_tag' को': first_office' के लिए बना सकता हूं और इसी तरह, एक बार जब मैं उन्हें परिभाषित करता हूं, और मेरी अपडेट कार्रवाई में सबमिट करता हूं? –

+1

* _field व्यू हेल्पर्स दिए गए ऑब्जेक्ट नाम को दिए गए ऑब्जेक्ट को फॉर्म_for के लिए देख रहे हैं। तो अगर आपने 'form_for @bulletin do | f |' किया है और फिर आप 'f.text_field: first_office' करते हैं तो 'text_field' सहायक ऑब्जेक्ट पर' first_office' नामक कुछ कॉल करेगा।यह एक विशेषता या एक विधि हो सकती है। वह "जादू" हिस्सा है;) – ZedTuX

5

यहां एक उदाहरण है जो शीर्ष_ऑफिस में मौजूदा कुंजी/मान जोड़े पर फिर से सक्रिय होता है और उनके लिए फॉर्म फ़ील्ड जेनरेट करता है।

<% @bulletin.top_offices.each do |key, value| %> 
    <input name="bulletin[top_offices][<%= key %>]" type="text" value="<%= value %>" /> 
<% end %> 

उत्पन्न करेगा:

<input name="bulletin[top_offices][first_office]" ... /> 
<input name="bulletin[top_offices][first_office_amount]" ... /> 
# etc. 

आप अपने उपयोगकर्ताओं पर भरोसा नहीं करते हैं तो आप top_offices के लिए प्रस्तुत मूल्यों पर मानसिक स्वास्थ्य की जांच करने के लिए कर सकते हैं।

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