2012-05-14 5 views
0

私は数日からこれに苦労しており、最終的に実装するのが難しくないと感じても頼むことにしました。アソシエーションを使ってhas_manyを編集する方法

私はレール3.1を使用していると私は、単一のフォームにhas_manyのの結合テーブルの複数のレコードを編集できるようにしたい:私はRyan Bates' railscastsを見

会合を介しが、これは私はまさにではありません探して、

その後、私は私が必要なものに非常に近くに見えることthis solutionを実装しようとしたが、それは、結合テーブルを編集していません。

これはシナリオです: は、私は多くのスキルを持っている(ユーザーのsublassある)選手がいます。各プレイヤーは、player_skillモデルに整数(1〜10)として格納されているスキルレベルを持っています。

私は、選手のスキルを作成して表示することができていると私は値を設定し、DBに格納し、私はDBから既存の値を取得し、ドロップダウンメニューで選択した値としてそれらを表示することはできません。私は各スキルごとにドロップダウンメニューを用いて、単一の形で与えられたプレイヤーのすべてのスキルレベルを編集できるようにしたい

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 

:これらは私のモデルです。今のところ私は設定してDBに保存することができますが、編集フォームをリロードすると値を取得できません。

これは私が編集フォームを作成するために使用するコードです。私は私のエラーは、私が既存の値をロードしていない選択のユーザーにあることを理解していますが、私はそうする方法を知らない。

<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

私はあなたが宣言する必要があると思う - 「player_skills」ではなく「スキル」のaccepts_nested_attributes_for。

ので、 クラスのプレーヤー<ユーザー

 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 %> 

EDIT:

あなたは、一定のオプションのリストを生成したい場合は - 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の値を表示する必要があります。 <[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

関連する問題