发布表单时收到以下错误: 无法找到没有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和名称所以我可以将它与那场比赛联系起来。
如果有更好的方法来关联已创建的实体,请告知我们。
答案 0 :(得分: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
哈希中的每个团队并将其添加到匹配对象(因为这是多对多)
答案 1 :(得分: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)
OR
另一种选择可以做同样的事情
如果您通过自动填充选择团队,那么在通过ajax选择团队后,您还可以添加名为 team_id 的隐藏字段,并且该值将被选为团队ID。
然后您可以轻松访问params [:team_id]
让我建议你新的思维方式
如果您认为匹配属于许多团队,该怎么办? 删除中间表
并在匹配新的和编辑表单上选择两个您想要匹配的球队。
供参考,看看这个 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
为什么我要你这样做? 答案是你必须在现有的团队之间创建匹配,而不需要保存团队保存的匹配。
但是在比赛中你需要保存球队。
希望这种治疗方法
答案 2 :(得分:0)
将params[:team_id]
更改为params[:teams_attributes][:id]
答案 3 :(得分:0)
has_many
匹配&lt;&gt;团队是一种矫枉过正。 Please see this solution用于模拟has_two关系。这将大大简化您的表单和URL。