2013-05-31 28 views
14

我正在做兩個模型的簡單練習。體育和團隊,定義爲Rails - 以表格形式顯示外鍵引用

 
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來引用現有的對象,帶有Sports的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一個選擇框,選擇將我在你的數據庫中的所有運動。

一些關於它的文檔

一個更清潔的方式是設置在控制器中的變量@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> 

其它附加信息,:如果你想「預選擇」爲選擇一個選項,你必須把它作爲了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 :: Error',它說'不能大規模分配受保護的屬性:sport_id' – Ricky

+2

我通過添加':sport_id'到我的attr_accessors teams_controller。這是做這件事的正確方法嗎?另外,我嘗試了第二種方法,它可以工作,但我不明白爲什麼。什麼是'Sport.scoped'呢?爲什麼只在'edit'方法中需要?例如,'new'方法也共享相同的'_form.html.erb'視圖,但我沒有在那裏調用'@sports = Sport.scoped',但它仍然可以工作......感謝任何見解 – Ricky