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"
属性,因为您已经加载并将名单与其关联。