2012-05-14 50 views
0

我現在這個掙扎,因爲幾天,最後編輯的has_many決定問,即使我覺得它不應該是很難實現的。如何通過關聯

我使用軌道3.1和我希望能夠在一個單一的形式編輯的has_many的連接表的一些記錄:通過關聯

我看了Ryan Bates' railscasts但是這不正是我是什麼尋找,

然後我試圖執行this solution看起來非常接近我所需要的,但它不是編輯連接表。

這是情景: 我的球員(誰是用戶的sublass)誰有很多技能。每個玩家都有一個技能等級,作爲一個整數(1到10)存儲在player_skill模型中。

我能夠創建並顯示玩家的技能,我可以設置值,並將其存儲在數據庫中,但我不能從數據庫中檢索現有值,並將其作爲在下拉菜單中選擇值。這是我的模型:

class Player < User 

    has_many :player_skills, :dependent => :destroy 
    has_many :skills, :through => :player_skills 
    accepts_nested_attributes_for :skills 

    attr_accessible :player_skills 

end 

class Skill < ActiveRecord::Base 
    has_many :player_skills 
    has_many :players, :through => :player_skills 
end 


# This stores the skill level as integer 1..10 

class PlayerSkill < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :skill 
end 

我希望能夠通過每每項技能下拉菜單進行編輯在一個單一的形式指定玩家所有技能水平。現在我可以設置並將它們保存到數據庫中,但是當我重新加載編輯表單時,我無法檢索這些值。

這是我用它來創建編輯表單代碼。我明白我的錯誤是在select的用戶,我沒有加載現有的值,但我不知道如何去做。

<h3><%= @user.first_name %> <%= @user.last_name %></h3> 
<% @skills = Skill.all %> 
<%= form_for @user, :url => updateplayerskills_path(@user) do |f| %> 


    <div class="field"> 
    <table border="1"> 
    <tr> 
     <td>Skill Name</td> 
     <td>Level</td> 

    </tr> 
    <% @skills.each do |skill| %> 
     <%= f.fields_for :player_skills do |builder| %> 
     <tr> 
     <td><%=h skill.name %></td> 
     <td> 

     #Here how can I load and display the existing level's value?? 
     #Shall I maybe use a different select method? 

     <%= f.select skill.id, 1..10 %>  
     </td> 
     </tr> 
     <% end %> 
    <% end %> 
    </table> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

任何幫助/提示非常感謝! 謝謝!

回答

2

我認爲你需要聲明 - accepts_nested_attributes_for爲「player_skills」,而不是「技能」。

所以, 類球員<用戶

 has_many :player_skills, :dependent => :destroy 
     has_many :skills, :through => :player_skills 
     accepts_nested_attributes_for :player_skills 

而且,當前的表單代碼是這樣的:

<% @skills.each do |skill| %> 
    <%= f.fields_for :player_skills do |builder| %> 
    <tr> 
     <td><%=h skill.name %></td> 
     <td> 
      <%= f.select skill.id, 1..10 %>  
     </td> 
    </tr> 
    <% end %> 
<% end %> 

我想應該是這樣的,而不是:

<%= f.fields_for :player_skills do |builder| %> 
    <tr> 
     <td> 
      <%= builder.label :skill_id, "Skill" %> 
      <%= builder.select(:skill_id, options_for_select(Hash[(1..10).collect { |n| [n.to_s, n] }])) %>  
     </td> 
    </tr> 
<% end %> 

編輯:

如果你想生成一個恆定的選項列表 - 10,你可以定義常量在application_helper.rb

module ApplicationHelper 
    MAX_SKILL_ID = 10 
end 

然後在您的視圖:

<%= f.fields_for :player_skills do |builder| %> 
    <tr> 
     <td> 
      <%= builder.label :skill_id, "Skill" %> 
      <%= builder.select(:skill_id, options_for_select(Hash[(1..ApplicationHelper::MAX_SKILL_ID).collect { |n| [n.to_s, n] }]), player_skill.level) %>  
     </td> 
    </tr> 
<% end %> 
+0

感謝薩里爾!我認爲我們在那裏。實際上,你的代碼顯示了從1到6的值(我有6個技能)的下拉菜單,但是我需要在那裏顯示player_skill.level的當前值和從1到10的值。我找到了**難看的**解決方案到目前爲止是<%= builder.select skill.id,options_for_select([['1',1],['2',2],['3',3],['4',4],[ '5',5],['6',6],['7',7],['8',8],['9',9],['10',10]],player_skill。級別)%>' – moncino07

+0

@ moncino07,根據您需要的常數更新我的答案。希望能幫助到你。 – Salil