2012-04-29 93 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 %>