2013-05-31 3 views
14

मैं दो मॉडल के साथ एक सरल अभ्यास कर रहा हूं। खेल और टीमों,रेल - एक फॉर्म में विदेशी कुंजी संदर्भ प्रदर्शित करना

 
rails g scaffold sport name:integer 
rails g scaffold team name:integer fans:integer sport:references 

के रूप में परिभाषित (नोट: कारण मैं पाड़ उपयोग कर रहा हूँ तेजी से तो कुछ हिस्सों के साथ प्रयोग प्रोटोटाइप है मैं सीख सकते हैं/मैं अभी तक से परिचित नहीं हूँ)

समस्या यह है कि मेरी "खेल" (विदेशी कुंजी संदर्भ यानी) निम्नलिखित enter image description here

तो यह यह करने के लिए है कि अजीब #<blahl blah> अंकन मिला है की तरह दिख रहा है ...

<%= form_for(@team) do |f| %> 
    <% if @team.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2> 

     <ul> 
     <% @team.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :fans %><br /> 
    <%= f.number_field :fans %> 
    </div> 
    <div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.text_field :sport %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

मैंने एक लाइन को @team.sport.name में बदलने की कोशिश की है, लेकिन इसके परिणामस्वरूप undefined method 'Ice Hockey' for #<Team:0x3e7e040> त्रुटि हुई है ... कोई विचार यहां से नाम को सही तरीके से कैसे प्रदर्शित करें ??

उत्तर

29

आप किसी मौजूदा ऑब्जेक्ट को संदर्भित करने के लिए text_field का उपयोग कर रहे हैं, select स्पोर्ट्स के साथ विकल्प विकल्प अधिक उपयुक्त होंगे।

यह वह जगह है जहां यह परिवर्तित करने की है:

<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.text_field :sport %> 
</div> 

करने के लिए:

<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.select :sport_id, options_for_select(Sport.all.map{|s|[s.name, s.id]}) %> 
</div> 

f.select HTML में एक सलेक्ट बॉक्स उत्पन्न होगा, विकल्प मुझे होगा अपने DB में सभी खेल।

इसके बारे में कुछ प्रलेखन:

एक क्लीनर तरीका एक चर @sports अपने नियंत्रक में स्थापित करने और अपने विचारों में तो यह कॉल करने के लिए किया जाएगा :

# in controller 
def edit 
    @sports = Sport.scoped 
    #... 

# in edit view 
<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.select :sport_id, options_for_select(@sports.map{ |s| [s.name, s.id] }) %> 
</div> 

additionnal जानकारी: यदि आप करने के लिए "पूर्व का चयन करें" का चयन के लिए एक विकल्प है, तो आप options_for_select सहायक के दूसरे तर्क के रूप में इसे पारित करने के लिए है चाहता हूँ:

options_for_select(@sports.map{ |s| [s.name, s.id] }, params[:sport_id]) 
# this will select by default the option that matches the value of params[:sport_id] 
+0

धन्यवाद @MrYoshiji । मैं शुरू करने के लिए अपना पहला सुझाव आज़मा रहा हूं, और मूल्य सही बॉक्स में सही ढंग से दिखाई देते हैं। हालांकि, मुझे सहेजने का प्रयास करते समय 'ActiveModel :: MassAssignmentSecurity :: त्रुटि' मिल रहा है, यह कह रहा है कि 'संरक्षित विशेषताओं को बड़े पैमाने पर असाइन नहीं किया जा सकता: sport_id' – Ricky

+2

मुझे अपने attr_accessors में 'sport_id' जोड़कर काम करना पड़ा teams_controller। क्या यह करने का सही तरीका था? इसके अलावा, मैंने दूसरी विधि की कोशिश की, और यह काम करता है, लेकिन मुझे समझ में नहीं आता क्यों। 'Sport.scoped' क्या है? इसे केवल 'संपादन' विधि में क्यों जरूरी है? उदाहरण, 'नई' विधि अभी भी वही '_form.html.erb' दृश्य साझा करती है, फिर भी मैं वहां '@sports = Sport.scoped' पर कॉल नहीं करता हूं लेकिन यह अभी भी काम करता है ... किसी भी अंतर्दृष्टि के लिए धन्यवाद – Ricky

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