2012-02-02 89 views
0

我是Rails中的新手。我有三名桌球員,花名冊和陣容。我有模型條目來創建玩家所屬的陣容和陣容,陣容has_many球員和陣容has_many球員之間的關係。在Rails 3.1中創建一種向表中添加新記錄的方法

我遇到的問題是當我創建名單時我有一個roster_name屬性,我可以添加一個單一的球員。我想增加更多的球員到相同的花名冊上,但我正在努力如何將新球員添加到花名冊中。默認的新視圖調用_form部分,它期望我創建一個全新的名單,這將允許我再次添加一個用戶。

什麼是軌道的方式來添加一個新的球員到現有名單。請幫我瞭解我需要什麼組件。我是否需要一個新的部分,我可以打電話給一個領域添加新的球員?我必須創建一個新的方法或控制器嗎?我所假設的是,我需要一種方法來引用現有名單,同時能夠添加新的player_id。任何幫助都會很棒。

這裏是我的模型/控制器和視圖

My model roster.rb 
class Roster < ActiveRecord::Base 
    has_many :players 

    accepts_nested_attributes_for :players, :allow_destroy => true 
end 
My model player.rb 
class Player < ActiveRecord::Base 
    belongs_to :roster 
end 
My controller rosters_controller.rb 
def new 
    @roster = Roster.new 
    @players = Player.all 
End 

My roster view 
<%= form_for(@roster) do |f| %>         
    <% if @roster.errors.any? %>          
    <div id="error_explanation">         
     <h2><%= pluralize(@roster.errors.count, "error") %> prohibited this roster from being saved:</h2> 

     <ul> 
     <% @roster.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li>       
     <% end %>          
     </ul>           
    </div>            
    <% end %>           

    <div class="field"> 
    <%= f.label :player_id %><br /> 
    <%= f.text_field :player_id %> 
    <%= collection_select("roster", "player_id", @players, "id", "gname") %> 
    </div> 
    <div class="field"> 
    <%= f.label :player_id %><br /> 
    <%= f.text_field :player_id %> 
    <%= collection_select("roster", "player_id", @players, "id", "gname") %> 

    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 

回答

0

自一個多一對多關聯,has_many :through協會經常被用來建立與其他模型中的許多一對多連接。該關聯表明聲明模型可以通過繼續第三個模型與另一個模型的零個或多個實例進行匹配。現在,協會的聲明看起來是這樣的:

class Roster < ActiveRecord::Base 
    has_many :roster_players 
    has_many :players, :through => :roster_players 
end 

class RosterPlayer < ActiveRecord::Base 
    belongs_to :roster 
    belongs_to :player 
end 

class Player < ActiveRecord::Base 
    has_many :roster_players 
    has_many :roster, :through => :roster_players 
end 

第1步: 生成關聯模型。

$> rails g model roster_player roster:references player:references 
$> rake db:migrate 

第2步: 你所需要的是接受嵌套屬性的方式。通過這個rails cast並閱讀有關nested_attributes。軌道投射的代碼形式已被Ryan Bates提取出來,並且非常有用。

更新您的Gemfile需要這種寶石

gem 'nested_form' 
$> bundle install 

下運行發電機,以創建JavaScript文件。這會自動檢測你是否使用jQuery或Prototype。

rails g nested_form:install 

運行發電機將增加應該包括了jQuery或Prototype框架後一個文件nested_form.js

<%= javascript_include_tag :defaults, "nested_form" %> 

讓我們提取嵌套屬性到部分名爲_roster_player_fields.html.erb

<div class="field"> 
    <%= f.label :player_id, "Player" %> 
    <%= f.select :player_id, Player.all.collect { |p| [ p.name, p.id ] }, { :include_blank => true } %> 
</div> 

我們要在這裏做的是添加字段每個名冊palyers的形式。我們可以使用fields_for方法來管理表單中的關聯字段,將相關模型的名稱傳遞給它,然後遍歷所有關聯的玩家記錄併爲每個記錄創建一個表單構建器。建造者將渲染每個玩家的部分。

<%= form_for(@roster) do |f| %>         
    <% if @roster.errors.any? %>          
    <div id="error_explanation">         
     <h2><%= pluralize(@roster.errors.count, "error") %> prohibited this roster from being saved:</h2> 

     <ul> 
     <% @roster.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li>       
     <% end %>          
     </ul>           
    </div>            
    <% end %>           

    <% f.fields_for :roster_players do |builder| %> 
    <%= render 'roster_player_fields', :f => builder %> 
    <% end %> 
    <%= link_to_add_fields "[+] Add Player", f, :roster_players %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

當這種形式呈現時,它會看起來像它以前做過的。這是因爲一個新名單不會有任何與之相關的球員,因此沒有任何球員領域會被顯示。最終,我們希望在表單上有一個「添加玩家」鏈接,但我們可以在RosterController的新操作中創建一個roster_player,並顯示其字段。

def new 
    @roster = Roster.new 
    @roster.roster_players.build 
End 

默認情況下嵌套屬性的更新被關閉,您可以使用#accepts_nested_attributes_for類方法啓用它。啓用嵌套屬性時,將在模型上定義屬性編寫器。這應該工作,並希望它有幫助。

+0

我似乎與嵌套屬性範例衝突。在該示例中,它使用註釋模型作爲文章模型的嵌套屬性。該評論僅與該文章有關。我想將player_id與名單關聯起來,並且即使沒有名單也讓球員存在。所以在應用程序的使用中,玩家將首先被添加,然後創建名單以選擇名單中的玩家。一些球員將不會在名冊上,我計劃擁有更多的球員名單。你發給我的例子仍然適合嗎?我在訪問播放器時遇到問題。 – RickO 2012-02-20 14:42:58

+0

使用關於模型結構的代碼更新問題。 – 2012-02-21 06:34:51

+0

對不起,對於遲到的回覆,我沒有看到你的回覆。我期待着一個獨立的領域。這是我的代碼。我試圖通過id將許多球員添加到名冊表中。我知道我的觀點現在有缺陷。我希望在新陣容字段中有多個可用於玩家ID的字段,從集合選擇下拉列表中選擇玩家並添加每個填充的字段。 – RickO 2012-03-03 00:18:44

相關問題