2010-01-06 13 views
34

में एक सरणी पास करना मैं एक सरणी को एक hidden_field में पास करने का प्रयास कर रहा हूं।hidden_field ROR

निम्नलिखित उपयोगकर्ता 3 भूमिकाओं [2,4,5]

>> u = User.find_by_login("lesa") 
=> #<User id: 5, login: "lesa", email: "[email protected]", crypted_password: "0f2776e68f1054a2678ad69a3b28e35ad9f42078", salt: "f02ef9e00d16f1b9f82dfcc488fdf96bf5aab4a8", created_at: "2009-12-29 15:15:51", updated_at: "2010-01-06 06:27:16", remember_token: nil, remember_token_expires_at: nil> 
>> u.roles.map(&:id) 
=> [2, 4, 5] 

उपयोगकर्ताओं/edit.html.erb

<% form_for @user do |f| -%> 
<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id) %> 

है जब मैं अपने संपादित फ़ॉर्म सबमिट करेंगे, मैं एक त्रुटि प्राप्त: ActiveRecord :: UserController में UpdateNotFound # अद्यतन "आईडी के साथ भूमिका नहीं मिल सका = 245"

मैं छुपा_फील्ड में सरणी कैसे पास कर सकता हूं?

उत्तर

81

मैं इस तकनीक का प्रयोग करेंगे।

<% @user.roles.each do |role| %> 
    <%= f.hidden_field :role_ids, :multiple => true, :value => role.id %> 
<% end %> 

:multiple कहते हैं दोनों नाम विशेषता और multiple="multiple" इनपुट तत्व है, जो आदर्श है के लिए के अंत तक []। जब रेलवे एरे के लिए इनपुट उत्पन्न करता है, जैसे fields_for में रेल आंतरिक रूप से इसका उपयोग करता है।

दुर्भाग्य से यह अच्छी तरह से प्रलेखित नहीं है। मैं इसे ठीक करने में देखने जा रहा हूं।

+3

मैं नहीं मानता कि यह अब और रेल 4 –

+2

में यह करता है रेल 4 में काम काम करता है हालांकि यह एक ही आईडी वाले आदानों उत्पन्न करता है। – Montas

+2

'hidden_field_tag' के साथ' form_tag' का उपयोग करते समय रेल 4.0.2 में मेरे लिए काम नहीं करता है, मुझे केवल 'पैराम्स [: role_ids]' में अंतिम भूमिका मिल जाएगी। 'Hidden_field_tag ​​'role_ids का उपयोग करना []' 'ठीक काम करता है। –

0

के साथ प्रयास करें:

<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id).join(", ") %> 
+0

बंद करें लेकिन यह अभी भी काम नहीं करता है। आवश्यक आउटपुट: "role_ids" => ["2", "4"] वास्तविक आउटपुट: "role_ids" => "2, 4" –

2

प्रयास करें:

<% @user.roles.each_with_index do |role| %> 
    <%= f.hidden_field "role_ids[]", :value => role.id %> 
<% end %> 
+0

जो हैश बनाने लगता है - शायद मैं इसके साथ घूमता हूं। –

+0

नया संस्करण आज़माएं? – jamuraa

+0

यह करीब है, क्या काम खत्म हो गया था ... <% f.fields_for: उपयोगकर्ता करते हैं | बिल्डर | %> <% = 'user_fields' प्रस्तुत करें, f => बिल्डर%> <% end %> फिर <% भूमिका = भूमिका.फिंड (: पहला)%> <% = f.hidden_field: role_ids,: value => भूमिका। आईडी%> –

4

मुझे लगता है कि यह अभी भी मेरे जैसे लोग, जो इस चलने ही प्रश्न पूछ googled के लिए उपयोगी होगा। मैं अगले थोड़ा हैक के साथ आया था:

<%= f.hidden_field "role_ids][", { :id => "role_ids", :value => [] } %> 

(छिपी हुई फ़ील्ड के लिए 'OBJECT_NAME' तर्क में उलट कोष्ठक पर ध्यान देना)।

+3

जैसा कि आप शायद समझ सकते हैं, यह काफी संभव है कि यह तकनीक रेल के बाद के संस्करण में टूट जाएगी क्योंकि यह काफी गैर-मानक है। – nertzy

12

केवल बात यह है कि मेरे लिए काम करता (रेल 3.1) hidden_field_tag ​​उपयोग कर रहा है:

<% @users.roles.each do |role| %> 
    <%= hidden_field_tag "user_role_ids[]", role.id %> 
<% end %> 
+0

user_role_ids [] के चारों ओर डबल कोट्स महत्वपूर्ण हैं। एकल उद्धरण मेरे लिए काम नहीं करते थे। –

+0

@ मार्कबॉबिन्सन: यह सही नहीं हो सकता है। –

1

रेल का उपयोग कर 4.2.6

मैं का उपयोग करने में सक्षम था

<% @user.roles.each do |role| 
    <%= f.hidden_field :role_ids, :id => role.id, :value => role.id, :multiple => true %> 
<% end %> 

जो गाया:

<input id="12345" value="12345" multiple="multiple" type="hidden" name="role_form[role_ids][]"> 

hidden_field_tag या 'role_ids[]' परम विवरण में शामिल नहीं किया जा रहा था का उपयोग करने की कोशिश कर मेरा form_params

यह काम नहीं किया:

<% @user.roles.each do |role| 
    <%= hidden_field_tag 'role_ids[]', role %> 
<% end %> 

क्योंकि यह renders:

<input type="hidden" name="role_ids[]" id="role_ids_" value="12345"> 

और नियंत्रक बाहर फार्म पैरामीटर के द्वारा देखा जाता है।

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