2011-01-09 14 views
16

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

<%= form_for([@user,@review]) do |f| %> 
<table> 
    <tr> 
    <td>Rank</td> 
    <td>Name</td> 
    <td>Comment</td> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "5" %> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "3" %> 
    </tr> 
    <tr> 
    <td>3</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "1" %> 
    </tr> 
</table> 
    <div class="actions"> 
    <%= f.submit "Create my top 3" %> 
    </div> 
<% end %> 

किसी भी सलाह की सराहना की जाती है। धन्यवाद।

उत्तर

26

मैं इसके लिए fields_for का उपयोग कर की सिफारिश करेंगे:

<%= form_for([@user, :reviews]) do |f| %> 
    <% @reviews.each do |review| %> 
    <%= fields_for review do |r| %> 
     <%= render "reviews/form", :r => r %> 
    <% end %> 
    <% end %> 
<% end %> 

यह काम करने के लिए, आपको अपने कंट्रोलर में जितनी आवश्यकता हो उतनी समीक्षा ऑब्जेक्ट्स बनाने की आवश्यकता होगी:

def new 
    # you could also have this in a before_filter... 
    @user = User.find(params[:id]) 
    @reviews = Array.new(3) { @user.reviews.build } 
end 

यह इस उपयोगकर्ता के लिए समीक्षा रिकॉर्ड के उदाहरण बना देगा, जो रिकॉर्ड्स से अलग है। उदाहरण बस रूबी वस्तुओं हैं। अब क्योंकि आपने @user.reviews.build को तीन बार बुलाया है, तो आपको अपने विचार में तीन समीक्षा दिखाई देगी।

def create 
    @user = User.find(params[:id]) 

    @reviews = Review.create(params[:reviews]) 
    # Some more logic for validating the parameters passed in 
end 

यह तीन नए Review वस्तुओं को बनाने और उन्हें @user से लिंक, यह मानते हुए सभी तीन मान्य हैं जाएगा।

+1

मैं आपकी पोस्ट से कुछ हद तक उलझन में हूं। मेरे द्वारा पोस्ट किया गया वर्तमान पृष्ठ समीक्षा # नया पृष्ठ है, तो क्या समीक्षा नियंत्रक में डीफ़ नया है जिसे आप "the_action" कह रहे हैं और इसी तरह जो भी_थिस_आईएस डिफेंस नियंत्रक में डिफ बनाता है? साथ ही जहां आप रेंडर फॉर्म में 'रेंडर/फॉर्म' डालते हैं? वर्तमान में,: url => reviews_path) मुझे एक नाम त्रुटि दे रहा है। धन्यवाद। – John

+3

क्या होगा यदि आपको नहीं पता कि कितने रिकॉर्ड की आवश्यकता है। पूर्व। उपयोगकर्ता अतिरिक्त प्रविष्टियों के लिए फॉर्म में 'नई पंक्ति' जोड़ सकता है। – turbo2oh

+2

एक नई पंक्ति जोड़ने के लिए यहां एक नज़र डालें: http://stackoverflow.com/questions/16919711/multiple-non-nested-model-creation-on-same-page/16920211#comment24427696_16920211 – MrYoshiji

6

आपको रेल को इसकी एक सरणी बताना होगा। सबसे पहले, read this section of this article:

उद्देश्य के लिए, आप हाथ से फार्म का निर्माण करने की आवश्यकता होगी:

<%= form_tag 'foo' do %> 
    <% [1,3,5].each do |i| %> 
    <%= text_field_tag 'review[][name]' %> 
    <%= text_field_tag 'review[][comment]' %> 
    <%= hidden_field_tag 'review[][rating]', :value => i %> 
    <% end %> 
<% end %> 
+0

ओपी के लिए 'accepts_nested_attributes_for' के साथ फ़ील्ड_ का उपयोग करना चाहिए। –

+1

उम्म ... क्या वास्तव में कोई फर्क पड़ता है? यह वही काम पूरा करता है और इस तरह रेल गाइड इसे करता है। वास्तव में एक सही ढंग से काम करेगा जब एक डाउनवोट लायक है? – sethvargo

+0

मैंने आपके द्वारा लिंक किए गए लेख और कुछ अन्य लोगों को पढ़ा है, लेकिन मुझे अभी भी यह काम करने में समस्याएं आ रही हैं। फॉर्म सही ढंग से प्रस्तुत कर रहा है, लेकिन 'foo' भाग मुझे समस्याएं दे रहा है। मैंने foo को user_review_path के साथ बदल दिया है लेकिन यह मुझे रूटिंग त्रुटि दे रहा है? क्या मुझे कुछ नया करना है या नियंत्रक या रूटिंग फ़ाइल बनाना है? – John

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