2012-03-20 7 views
6

मैं रेल में एक नेस्टेड मॉडल बना रहा हूं, लेकिन मैं नियंत्रक में नेस्टेड मॉडल में फ़ील्ड जोड़ना चाहता हूं। मैं hidden_field_tag ​​का उपयोग नहीं कर रहा हूं क्योंकि इसे छेड़छाड़ की जा सकती है।रेल में पैराम हैश को संशोधित करना

Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"} 

क्या मैं चाहता हूँ प्रत्येक user_attributes companyid कहा जाता है के तहत एक क्षेत्र होने के लिए वहाँ के लिए है:

यहाँ मेरी पैरामीटर हैश है। मान लीजिए कि मैं "कंपनी" होने के लिए companyid चाहता था चलो, तो मैंने सोचा था कि यह काम करेगा:

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter]["companyid" => "company"] 
    counter = counter + 1 
end 

लेकिन, मुझे मिल "अपरिभाषित विधि` [] 'शून्य के लिए: NilClass "थोड़ी देर में पहली पंक्ति के लिए त्रुटि पाश। मुझे बिल्कुल यकीन नहीं है क्यों।

क्या कोई मेरी मदद कर सकता है ताकि मैं पैरा हैश को संशोधित कर सकूं?

संपादित करें: तो, आखिरकार, मैंने इसे समझ लिया। मैंने वास्तव में किसी भी समाधान का बिल्कुल उपयोग नहीं किया था। सबसे पहले, मैंने कंपनी के लिए एक छुपा_फील्ड टैग खाली होने के लिए सेट किया है। फिर, मेरे नियंत्रक में मैंने रखा:

params["dummy"]["users_attributes"].each do |key, val| 
    params["dummy"]["users_attributes"][key]["companyid"] = "company" 
end 

सबसे सुरुचिपूर्ण कोड नहीं है, लेकिन यह काम करेगा।

उत्तर

4

पैराम हैश विशेष है (विशेष रूप से रूपों के साथ) यह मॉडल के साथ एक-एक के लिए मैप किया गया है, और रेल उम्मीद करता है कि वहां डेटाबेस कॉलम हो या एक विधि हो उस नाम वाले मॉडल।

छिपे हुए फ़ील्ड अतिरिक्त डेटा प्राप्त करने की समस्या का सामान्य समाधान हैं, लेकिन यदि आप नहीं चाहते हैं कि उपयोगकर्ता उन फ़ील्ड को देखना चाहते हैं, तो आप समस्या में भाग लेते हैं कि HTTP स्टेटलेस है। तो इस मामले में, session[:something] आपका मित्र है। एक फॉर्म या पेज प्रदर्शित करने से पहले जिसमें छुपा डेटा हो, इसके बजाय डेटा को एक सत्र चर में जोड़ें (इसे पहले एन्क्रिप्ट करें), जिसे आप फॉर्म को सबमिट करते समय पढ़ सकते हैं (और डिक्रिप्ट)। या आप इसे डेटाबेस तालिका में सहेज सकते हैं और सत्र में केवल पंक्ति आईडी डाल सकते हैं ताकि फॉर्म पोस्ट होने पर डेटा को वापस पढ़ा जा सके।

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

डेटा संवेदनशील नहीं है, तो आप सिर्फ मूल्यों (बड़े पैमाने पर काम रोकता है) है कि उपयोगकर्ता अपने-अपने मॉडल में attr_accessible के रूप में बदल सकते हैं घोषित करने और छिपा क्षेत्रों में दूसरों डाल करने के लिए सुनिश्चित करें।

+0

मैं आपको चेक दे रहा हूं क्योंकि छिपे हुए क्षेत्रों की गहराई से चर्चा में मुझे समाधान का पता लगाने की अनुमति दी गई है। धन्यवाद! – NielMalhotra

+2

मुझे शुद्धता में क्या कमी है, मैं verbosity में बनाओ। मुझे जावा प्रोग्रामर होना चाहिए था! (ओह, रुको, मैं था)। तो, समाधान क्या _was_ है? –

+0

यह मूल पोस्ट के संपादन में है: f.hidden_field: formid में companyid और फिर ऊपर कोड स्निपेट – NielMalhotra

0

यह बदसूरत लग रहा है और मुझे समझ नहीं आता कि क्या हो रहा है, लेकिन अपनी गलती है:

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter] = { "companyid" => "company" } 
    counter = counter + 1 
end 

मेरा मानना ​​है कि आप यहाँ accepts_nested_attributes_for का उपयोग करें और नियंत्रक में नई कंपनियों को प्रारंभ करना चाहिए, नहीं यह बदसूरत कोड

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

0

यह नहीं है कि कैसे हैंश काम करते हैं। इस प्रयास करें:

params["dummy"]["users_attributes"][counter]["companyid"] = "company" 

संपादित fl00r के जवाब के अलावा, हाँ, यदि आप {स्थापित करने के लिए [ "companyid"] होने के लिए} पहले होगा।