Rails 3.1+嵌套表单问题:无法批量分配受保护的属性

我有一个篮球应用程序,其中一个名单有很多玩家,一个玩家可以在多个名单上。(多对多的原因是玩家 – 名册档案)

Roster.rb

class Roster  :rosterizes accepts_nested_attributes_for :players attr_accessible :jersey_number, :team_id, :class_year, :players end 

Rosterizes.rb (名字不好我知道……)

 class Rosterize < ActiveRecord::Base belongs_to :player belongs_to :roster attr_accessible :player_id, :roster_id end 

Player.rb

 class Player  :rosterizes validates_presence_of :first_name, :last_name attr_accessible :first_name, :last_name, :active end 

风景

 

New Player

player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %> :hidden, :input_html => {:value => params[:id]}%>
'btn-primary icon-plus-sign btn-success', :value => "Add To Team" %>

我发送给控制器的参数:

 "roster"=>{"player"=>{"first_name"=>"first name", "last_name"=>"last name"}, "class_year"=>"freshman", "jersey_number"=>"23", "team_id"=>"1"}, "commit"=>"Add To Team", "id"=>"1"} 

正在处理保存的控制器:

 def player_added @team = Team.find(params[:id]) #where the issue is happening @roster = @team.rosters.build(params[:roster]) @roster.save ... end 

我有一个使用参数的工作, 我想了解我在这里做错了未来/学习目的以及为什么它给了我:不能大规模分配受保护的属性

我的工作(有点hacky):

 def player_added @team = Team.find(params[:id]) @roster = @team.rosters.build(:class_year => params[:roster][:class_year], :jersey_number => params[:roster][:jersey_number]) @new_player = @roster.players.build(:first_name => params[:roster][:player][:first_name], :last_name => params[:roster][:player][:last_name]) @roster.save @new_player.save ... end 

我正在使用Simple_Form 2.0 …

我知道这是很多信息,但提前谢谢你!

只是因为其他人有相同或类似的问题我…

我安装了这个插件=> https://github.com/ryanb/nested_form

所以这就是我所做的改变:

Roster.rb

 class Roster  :rosterizes accepts_nested_attributes_for :players attr_accessible :jersey_number, :class_year, :players, :player_attributes end 

我还对视图进行了更改:

  player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %>  # nested form ...  # form ...  

控制器保存def player_added

 @team = Team.find(params[:id]) @roster = @team.rosters.build(params[:roster]) @roster.save ... 

结束

这对我来说很难理解,希望这会减少你找任何答案/学习嵌套forms的时间!

问题在于您命名嵌套关联属性的方式以及您要发送的参数:

嵌套:players的属性应该是:players_attributes ,并且:team_id不应该列出:team_id (因为这会覆盖团队关联rails magic):

 attr_accessible :jersey_number, :class_year, :players_attributes 

参数应该具有以下格式:

 "roster"=>{"players_attributes"=>[{"first_name"=>"first name", "last_name"=>"last name"}], "class_year"=>"freshman", "jersey_number"=>"23"}, "commit"=>"Add To Team", "id"=>"1"} 

要实现这一点,您应该将simple_form_for @roster更改为simple_nested_form_for @roster

请注意,您不需要在"roster"的参数中包含"team_id"属性,因为您已经加载并将名单与其关联。