0

几天以来,我一直在为此苦苦挣扎,最后决定问一下,即使我觉得实施起来应该不那么难。

我正在使用 rails 3.1,我希望能够以单一形式编辑 has_many 连接表的多个记录:通过关联

我看了Ryan Bates 的 railscasts但这不是我想要的,

然后我尝试实现这个看起来非常接近我需要的解决方案,但它没有编辑连接表。

这是场景:我有很多技能的玩家(他们是用户的子类)。每个玩家都有一个技能等级,它以整数(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 %>

非常感谢任何帮助/提示!谢谢!

4

1 回答 1

2

我认为您需要为“player_skills”而不是“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 回答