2012-04-05 10 views
5

Me aparece un error ActiveSupport::HashWithIndifferentAccess cuando intento actualizar un formulario incrustado.ActiveSupport :: HashWithIndifferentAccess en Embedded Form Update

Aquí está el ejemplo más sencillo:

Forma:

<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 %> 

Modelos:

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 

controlador:

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 

Este es el objeto params[:players_to_team] en forma de s RESENTACIÓN:

:players_to_team

¿Qué significa un error ActiveSupport::HashWithIndifferentAccess? ¿Qué debo hacer para que este formulario actualice la entrada players_to_team?

Editar

BT es una columna en players_to_teams. Si elimino el bloque field_for, puedo guardar con éxito el campo BT/players_to_teams fila.

Gracias

+0

lo que el atributo "BT" - que es el nombre correcto de un campo de la mesa players_to_teams? –

+0

Sí. Pregunta actualizada para proporcionar más información. –

+0

puede cambiar "<% = field.fields_for @ players_to_teams.player" por "<% = field.fields_for: player" –

Respuesta

5

mérito es de @Brandan. Respondido: What is the difference between using ":" and "@" in fields_for

De acuerdo, pude clonar su proyecto de ejemplo y reproducir el error. Creo que entiendo lo que está pasando.

Después de su llamada a accepts_nested_attributes_for, ahora tiene un método de instancia en su modelo llamado player_attributes =. Esto está en además del jugador = método que normalmente se define para una asociación has_one . El método player_attributes = acepta un hash de atributos , mientras que el método player = solo acepta un objeto real Player .

He aquí un ejemplo de la entrada de texto generado cuando llamó fields_for @ players_to_teams.player:

y aquí es que misma entrada al llamar fields_for: jugador:

cuando se update_attributes de llamadas en su controlador , el primer ejemplo llamará a player =, mientras que el segundo ejemplo llamará player_attributes =. En ambos casos, el argumento pasado al método es un hash (porque params es en última instancia solo un hash de hashes).

Es por eso que estabas obteniendo un AssociationTypeMismatch: no puedes pasar un hash al player =, solo un objeto Player.

Parece que la única forma segura de utilizar fields_for con es que accept_nested_attributes_for está pasando el nombre de la asociación y no la asociación en sí.

Así que para responder a su pregunta original, la diferencia es que uno trabaja y el otro no :-)

Cuestiones relacionadas