4

发布表单时出现以下错误:找不到没有 ID 的团队

我有以下帖子参数

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"knq4dG1U/5NJxMD6KYxfOpKd3CuOBHRlp6xCwdpwCnQ=",
 "match"=>{"name"=>"latest match",
 "date(1i)"=>"2013",
 "date(2i)"=>"5",
 "date(3i)"=>"19",
 "teams_attributes"=>{"1368967240149"=>{"name"=>"Navi",
 "id"=>"1"}}},
 "commit"=>"Update Match",
 "match_id"=>"2"}

模型:

team has_many :matchips

team has_many :matches :through => matchips

match has_many :matchips
match has_many :teams :through => matchips

团队控制器:

  def create


    @team = Team.find(params[:team_id])  <-----fails here!


    redirect_to @match

  end

形式:

<%= nested_form_for @match, :url => {:action => "add_team_to_match_post"} do |f| %>
  <% if @match.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@match.errors.count, "error") %> prohibited this match from being saved:</h2>

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

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :date %><br />
    <%= f.date_select :date %>
  </div>

  <%= f.fields_for :teams, :html => { :class => 'form-vertical' } do |builder| %>
  <%= builder.label "Team Name:" %>
    <%= builder.autocomplete_field :name, autocomplete_team_name_teams_path, :update_elements => {:id => "##{form_tag_id(builder.object_name, :id)}" },:class => "input-small",:placeholder => "Search" %>
  <%= builder.hidden_field :id %>

  <% end %>

  <%= f.link_to_add raw('<i class="icon-plus-sign"></i>'), :teams, :class => 'btn btn-small btn-primary' %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

所以我基本上在比赛和球队之间有一个多对多的关系。使用nested_form 进行匹配,但问题是它在创建或更新之前寻找关联,我想要它。我以前使用多对一关联完成此操作,其中在创建或更新父模型时将创建子模型,在这种情况下,我已经拥有团队,我所做的就是通过 post/put 请求传递 id 和 name所以我可以把它和那场比赛联系起来。

如果有更好的方法来关联已创建的实体,请告诉我。

4

4 回答 4

2

你可能需要类似的东西:

def add_team_to_match_post

    @match = Match.find(params[:match_id])

    params[:teams_attributes].each_value do |team_attributes|
      team = Team.find(team_attributes[:id])
      @match.teams << team
      team.matches << @match
    end

    redirect_to @match
end

基本上,这是遍历teams_attributes哈希中的每个团队并将其添加到匹配对象(因为这是多对多)

于 2013-05-19T15:44:29.890 回答
2

在查看了这个并在 team_attributes 中假设关键id是团队的 id。

 "match"=>{"name"=>"latest match",
     "date(1i)"=>"2013",
     "date(2i)"=>"5",
     "date(3i)"=>"19",
     "teams_attributes"=>{"1368967240149"=>{"name"=>"Navi",
     "id"=>"1"}}}

在控制器中执行此操作

 team_key = params['match']['teams_attributes'].keys.first
 team_id = params['match']['teams_attributes']['team_key']['id']

 Team.find(team_id)

或者

另一种选择可以做同样的事情

如果您通过自动完成选择团队,那么在通过 ajax 选择团队后,您还可以添加名称为team_id的隐藏字段,它的值将被选择团队 ID。

然后您可以轻松访问 params[:team_id]


让我建议你新的思维方式

如果,如果您认为一场比赛属于多支球队,请 移除中间牌桌

并在新匹配和编辑表单上选择两支您想要举行的比赛的球队。

参考看看这个 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

为什么我要你这样做?答案是您必须在现有团队之间创建匹配,并且无需在团队保存时保存匹配。

但是在比赛保存时,您必须保存团队。

希望这个治愈

于 2013-05-23T07:18:42.490 回答
0

has_many对于 Matches <> Teams 来说太过分了。请参阅此解决方案以模拟 has_two 关系。这将大大简化您的表单和 URL。

于 2013-05-24T04:34:48.470 回答
0

更改params[:team_id]params[:teams_attributes][:id]

于 2013-05-19T14:29:35.673 回答