2012-04-05 32 views
5

Tôi gặp phải lỗi ActiveSupport::HashWithIndifferentAccess khi tôi cố gắng cập nhật biểu mẫu được nhúng.ActiveSupport :: HashWithIndifferentAccess trên Cập nhật Biểu mẫu Nhúng

Dưới đây là ví dụ đơn giản:

Mẫu:

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

Models:

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 

Bộ điều khiển:

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 

Đây là đối tượng params[:players_to_team] khi hình thức s ubmission:

:players_to_team

không một lỗi ActiveSupport::HashWithIndifferentAccess nghĩa là gì? Tôi cần phải làm gì để có biểu mẫu này cập nhật mục nhập players_to_team?

Sửa

BT là một cột trong players_to_teams. Nếu tôi xóa teh field_for khối, tôi có thể lưu thành công trường BT/hàng players_to_teams.

Cảm ơn

+0

những gì đang thuộc tính "BT" - đó là tên chính xác của một trường trên bảng players_to_teams? –

+0

Yea. Đã cập nhật câu hỏi để cung cấp thêm thông tin. –

+0

bạn có thể thay đổi "<% = field.fields_for @ players_to_teams.player" thành "<% = field.fields_for: player" –

Trả lời

5

Tín dụng chuyển đến @Brandan. Đã trả lời: What is the difference between using ":" and "@" in fields_for

OK, tôi đã có thể sao chép dự án mẫu của bạn và tạo lại lỗi. Tôi nghĩ rằng tôi hiểu những gì đang xảy ra.

Sau cuộc gọi của bạn để chấp nhận_nested_attributes_for, bây giờ bạn có phương thức cá thể trên mô hình của bạn có tên player_attributes =. Điều này là trong Ngoài trình phát = phương thức được xác định thông thường cho liên kết has_one . Phương thức player_attributes = chấp nhận hàm băm thuộc tính , trong khi phương thức player = chỉ chấp nhận đối tượng Người chơi thực tế .

Dưới đây là một ví dụ về nhập văn bản được tạo ra khi bạn gọi fields_for @ players_to_teams.player:

và đây là rằng cùng đầu vào khi gọi fields_for: máy nghe nhạc:

Khi bạn update_attributes cuộc gọi trong điều khiển của bạn , ví dụ đầu tiên sẽ gọi là player =, trong khi ví dụ thứ hai sẽ gọi player_attributes =. Trong cả hai trường hợp, đối số được chuyển cho phương thức là một hàm băm (vì thông số cuối cùng chỉ là một băm băm).

Đó là lý do tại sao bạn nhận được một AssociationTypeMismatch: bạn không thể vượt qua một hàm băm cho người chơi =, chỉ một đối tượng Trình phát.

Dường như cách an toàn duy nhất để sử dụng các trường_đối với accept_nested_attributes_for là bằng cách chuyển tên của liên kết chứ không phải liên kết.

Vì vậy, để trả lời câu hỏi ban đầu của bạn, sự khác biệt là một trong các công trình và người kia không :-)

Các vấn đề liên quan