rails post params找不到id

时间:2013-05-19 12:46:36

标签: ruby ruby-on-rails-3

发布表单时收到以下错误: 无法找到没有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和名称所以我可以将它与那场比赛联系起来。

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

4 个答案:

答案 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。