ruby-on-rails – 在fields_for中使用“:”和“@”有什么区别
我正在我的rails应用程序中设置嵌入式表单.
这不起作用 <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 %> 给我一个ActiveRecord :: AssociationTypeMismatch错误.注意forms_for行中的@ players_to_teams.player. 这确实有效: <h1>PlayersToTeams#edit</h1> <%= form_for @players_to_teams do |field| %> <%= field.fields_for :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 %> 注意:fields_for行中的:player调用. 什么是使用符号和使用实例之间的区别?我想我会想在这种情况下使用一个实例,但我猜不是吗? 编辑 楷模: class Player < ActiveRecord::Base has_many :players_to_teams has_many :teams,through: :players_to_teams end class PlayersToTeam < ActiveRecord::Base belongs_to :player belongs_to :team accepts_nested_attributes_for :player 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 示例项目 Github:https://github.com/workmaster2n/embedded-form-errors 解决方法
看起来fields_for无法弄清楚@players_to_teams实例变量的玩家关联是什么.您可以通过明确指定关联的名称(即:播放器)来绕过它.您是否在两个方向定义关联?即:
class PlayersToTeam < ActiveRecord::Base has_one :player end class Player < ActiveRecord::Base belongs_to :players_to_team end 另外,查看the documentation for 好的,我能够克隆你的示例项目并重现错误.我想我明白发生了什么. 在调用 以下是调用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_for与accepts_nested_attributes_for一起使用的唯一安全方法是传递关联的名称而不是关联本身. 所以回答你原来的问题,区别在于一个有效,另一个没有:-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |