0

私は数日前からこれに苦労しており、実装するのがそれほど難しくないと感じていても、最終的に尋ねることにしました。

Rails 3.1 を使用しており、 has_many :through 関連付けの結合テーブルの複数のレコードを単一のフォームで編集できるようにしたい

Ryan Bates の railscastを見ましたが、これはまさに私が探しているものではありません。

次に、必要なものに非常に近いこのソリューションを実装しようとしましたが、結合テーブルを編集していません。

これがシナリオです: 多くのスキルを持つプレイヤー (ユーザーのサブクラス) がいます。各プレーヤーには、整数 (1 から 10) として player_skill モデルに格納されているスキル レベルがあります。

プレイヤーのスキルを作成して表示し、値を設定して 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に保存することはできますが、編集フォームをリロードすると値を取得できません。

これは、編集フォームを作成するために使用するコードです。私のエラーは、既存の値をロードしていない 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 %>

どんな助け/ヒントも大歓迎です! ありがとう!

4

1 に答える 1

2

「スキル」ではなく「player_skills」に対してaccepts_nested_attributes_forを宣言する必要があると思います。

したがって、クラス Player < User

        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 %>
于 2012-05-15T05:19:37.693 に答える