2012-04-29 95 views
2

我有以下模型設置。我有比賽和比賽。匹配has_many:遊戲,Match match_nested_attributes_for:遊戲。 :games_attributes是所有成員attr_accessible。我的問題是,fields_for沒有生成正確的表單,所以Match不接受遊戲的嵌套屬性。這裏是我的表單代碼:當屬性通過has_many關聯時,你如何接受一個嵌套屬性?

<%= form_for [@tournament, match], url: tournament_match_path(@tournament, match) do |f| %> 
    <%= f.fields_for match.games.last do |builder| %> 
    <%= builder.hidden_field :winner_id, value: 1 %> 
    <% end %> 
    <%= f.submit "Win Game", class: "actionButton activeAction" %> 
<% end %> 

這樣產生的代碼是:

<form id="edit_match_1" class="edit_match" method="post" action="/tournaments/1/matches/1" accept-charset="UTF-8"> 
    <div style="margin:0;padding:0;display:inline"> <!-- rails stuff here --></div> 
    <input id="match_game_winner_id" type="hidden" value="1" name="match[game][winner_id]"> 
    <input class="actionButton activeAction" type="submit" value="Win Game" name="commit"> 
</form> 

正如你所看到的,match_game_winner_id的名稱不正確。名稱匹配[遊戲] [winner_id],但名稱應該匹配[games_attributes] [0] [winner_id]。我怎麼解決這個問題?

+0

這不是一個答案,但我懷疑這個問題是因爲你正在處理其他嵌套資源中的嵌套資源。我明白了爲什麼'tournaments /:id/matches /:id/games'是有道理的,但我懷疑你會遇到一些麻煩,讓表單生成器進行合作。我說,因爲我沒有看到你的代碼有什麼問題,但你說得對,生成的輸出是不正確的。 – Andrew

+0

我不這麼認爲。我認爲這個問題是由於將單一資源傳遞給f.fields_for。如果我用'f.fields_for:games'替換'f.fields_for match.games.last',我會得到正確的輸出結果。 – Max

+0

好吧,我解決了這個問題。這很奇怪,我不知道爲什麼這會起作用,但我用f.fields_for:games,:last'替換了'f.fields_for match.games.last'。 – Max

回答

1

我最終自己解決了這個問題,並希望分享我的發現以幫助處於類似情況的其他人。正如Andrew在評論中所說的那樣,fields_for期待一個符號,所以爲了獲得最後一場比賽,我需要傳遞一個符號列表,以符合獲得最後一場比賽的方法。我的表單最終看起來是這樣的:

<%= form_for [@tournament, match], url: tournament_match_path(@tournament, match) do |f| %> 
    <%= f.fields_for :games, :last do |builder| %> 
    <%= builder.hidden_field :winner_id, value: 1 %> 
    <% end %> 
    <%= f.submit "Win Game", class: "actionButton activeAction" %> 
<% end %>