9

ActiveSupport::HashWithIndifferentAccess尝试更新嵌入式表单时出现错误。

这是最简单的例子:

形式:

<h1>PlayersToTeams#edit</h1>
<%= form_for @players_to_teams do |field| %>
    <%= field.fields_for @players_to_teams.player do |f| %>
        <%= f.label :IsActive %>
        <%= f.text_field :IsActive %>
    <% end %>
    <%= field.label :BT %>
    <%= field.text_field :BT %>
    <br/>
    <%= field.submit "Save", class: 'btn btn-primary' %>
<% end %>

楷模:

class PlayersToTeam < ActiveRecord::Base
  belongs_to :player
  belongs_to :team

  accepts_nested_attributes_for :player
end

class Player < ActiveRecord::Base
  has_many :players_to_teams
  has_many :teams, through: :players_to_teams
end

控制器:

class PlayersToTeamsController < ApplicationController
  def edit
    @players_to_teams=PlayersToTeam.find(params[:id])
  end

  def update
    @players_to_teams=PlayersToTeam.find(params[:id])
    respond_to do |format|
      if @players_to_teams.update_attributes(params[:players_to_team])
        format.html { redirect_to @players_to_teams, notice: 'Player_to_Team was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @players_to_teams.errors, status: :unprocessable_entity }
      end
    end
  end
end

这是params[:players_to_team]表单提交时的对象:

:players_to_team

错误是什么ActiveSupport::HashWithIndifferentAccess意思?我需要做什么才能让此表单更新players_to_team条目?

编辑

BT是 中的一列players_to_teams。如果我删除field_for块,我可以成功保存BT字段/players_to_teams行。

谢谢

4

1 回答 1

7

归功于@Brandan。回答:fields_for中使用“:”和“@”有什么区别

好的,我能够克隆您的示例项目并重现错误。我想我明白发生了什么。

在您调用 accept_nested_attributes_for 之后,您现在在您的模型上有一个名为 的实例方法player_attributes=。这是对通常为 关联player=定义的方法的补充。has_oneplayer_attributes=方法接受属性的散列,而该player=方法只接受一个实际的 Player 对象。

这是您调用时生成的文本输入的示例 fields_for @players_to_teams.player

<input name="players_to_team[player][name]" ... />这是调用时相同的输入fields_for :player

<input name="players_to_team[player_attributes][name]" ... />当您调用update_attributes控制器时,第一个示例将调用 player=,而第二个示例将调用player_attributes=。在这两种情况下,传递给方法的参数都是散列(因为 params 最终只是散列的散列)。

这就是为什么你得到一个AssociationTypeMismatch:你不能将哈希传递给player=,只能传递一个 Player 对象。

似乎唯一安全的使用方式fields_foraccepts_nested_attributes_for传递关联的名称而不是关联本身。

因此,要回答您最初的问题,区别在于一个有效,另一个无效:-)

于 2012-04-11T17:05:07.360 回答