2012-06-26 10 views
15

के साथ सरणी का उपयोग करके फ़ील्ड_for का उपयोग करके मैं ऑब्जेक्ट्स (सभी समान मॉडल) के माध्यम से कैसे पुन: प्रयास कर सकता हूं? सरणी में current_user द्वारा बनाई गई ऑब्जेक्ट्स हैं।फ़ील्ड_for

मैं वर्तमान में है:

<%= f.fields_for :descriptionsbyuser do |description_form| %> 
<p class="fields"> 
    <%= description_form.text_area :entry, :rows => 3 %> 
    <%= description_form.link_to_remove "Remove this description" %> 
    <%= description_form.hidden_field :user_id, :value => current_user.id %> 
</p> 
<% end %> 

लेकिन मैं बदलना चाहते हैं: एक सरणी मैं अपने नियंत्रक में बनाया के साथ descriptionsbyuser - @descriptionsFromCurrentUser

यह रयान बाते की 'nested_form_for "

अंदर भी है

किसी भी पॉइंटर्स की सराहना की जाएगी!

एडम

उत्तर

18

Docs for fields_for स्पष्ट रूप से आप सरणियों का उपयोग करने का रास्ता दिखाता है:

या एक संग्रह प्रयोग की जाने वाली:

<%= form_for @person do |person_form| %> 
    ... 
    <%= person_form.fields_for :projects, @active_projects do |project_fields| %> 
    Name: <%= project_fields.text_field :name %> 
    <% end %> 
    ... 
<% end %> 

@active_projects यहाँ सरणी है।

+0

धन्यवाद jdoe! मुझे जिस चीज की जरूरत थी! – adamteale

+11

यह मेरे लिए काम नहीं कर रहा है। मुझे # 'के लिए 'अपरिभाषित विधि' नाम 'जैसा कुछ मिल रहा है। – Ajedi32

+3

@ Ajedi32 et al => आपके मॉडल को संग्रह विशेषताओं के लिए एक सेटटर लागू करने की आवश्यकता है। अजीब से जवाब देखें। गैर-ActiveRecord कार्यान्वयन विवरण के लिए – barelyknown

22

fields_for के लिए संग्रह का उपयोग करने के लिए और इसे जिस तरह से आप उम्मीद करते हैं, उस पर काम करें, मॉडल को संग्रह के लिए नेस्टेड विशेषताओं को स्वीकार करने की आवश्यकता है। यदि संग्रह ActiveRecord एक से कई रिश्ते है, तो accepts_nested_attributes_for क्लास मैक्रो का उपयोग करें। यदि संग्रह ActiveRecord एक से कई रिश्ते नहीं है, तो आपको संग्रह गेटर और संग्रह विशेषता सेटटर को लागू करने की आवश्यकता होगी।

यदि यह एक ActiveRecord रिश्ता है:

class Person 
    has_many :projects 

    # this creates the projects_attributes= method 
    accepts_nested_attributes_for :projects 
end 

यदि यह एक गैर ActiveRecord रिश्ता है:

class Person 
    def projects 
    ... 
    end 

    def projects_attributes=(attributes) 
    ... 
    end 
end 

किसी भी तरह से, प्रपत्र में ही है:

<%= form_for @person do |f| %> 
    ... 
    <%= f.fields_for :projects, @active_projects do |f| %> 
    Name: <%= f.text_field :name %> 
    <% end %> 
    ... 
<% end %> 
+0

+1।किसी भी तरह से मेरी आंखों ने यह देखने से इंकार कर दिया कि दस्तावेज़ों में स्पष्ट रूप से क्या समझाया गया था ... –

5

मैंने इसे सबसे साफ तरीका पाया

अगर आप सीधे डेटा के साथ काम कर रहे हैं और इन @objects में से किसी का उपयोग किए बिना एक सरणी वापस भेजने के लिए

<%= form_for :team do |t| %> 
    <%= t.fields_for 'people[]', [] do |p| %> 
    First Name: <%= p.text_field :first_name %> 
    Last Name: <%= p.text_field :last_name %> 
    <% end %> 
<% end %> 
अपने परम

डेटा इस

"team" => { 
    "people" => [ 
    {"first_name" => "Michael", "last_name" => "Jordan"}, 
    {"first_name" => "Steve", "last_name" => "Jobs"}, 
    {"first_name" => "Barack", "last_name" => "Obama"} 
    ] 
} 
5

barelyknown के जवाब में नया की तरह वापस आ जाएगी (चाहते हैं प्रतिष्ठा बिंदुओं के कारण टिप्पणी के रूप में जोड़ने में सक्षम नहीं था) -

गैर-सक्रिय रिकॉर्ड मामले के लिए, मुझे *_attributes=(attributes) के अलावा मेरी कक्षा में persisted? को भी परिभाषित करना पड़ा।