Rails 3.1+ Nested Forms Problem: Geschützte Attribute können nicht massenweise zugewiesen werden
Ich habe eine Basketball-App, in der ein Kader viele Spieler hat und ein Spieler mehrere Kader haben kann. (Grund für viele-zu-viele ist für ein Spieler-Kader-Archiv.)
Roster.rb
<code>class Roster < ActiveRecord::Base belongs_to :team has_many :rosterizes has_many :players, :through => :rosterizes accepts_nested_attributes_for :players attr_accessible :jersey_number, :team_id, :class_year, :players end </code>
Rosterizes.rb(schlecht benannt, ich weiß ...)
<code>class Rosterize < ActiveRecord::Base belongs_to :player belongs_to :roster attr_accessible :player_id, :roster_id end </code>
Player.rb
<code>class Player < ActiveRecord::Base has_many :rosterizes has_many :rosters, :through => :rosterizes validates_presence_of :first_name, :last_name attr_accessible :first_name, :last_name, :active end </code>
Die Aussicht
<code><div class="well"> <h2>New Player</h2> <%= simple_form_for @roster, :url =>player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %> <%= f.simple_fields_for @new_player do |x| %> <%= x.input :first_name %> <%= x.input :last_name %> <%end%> <%=f.input :class_year %> <%=f.input :jersey_number %> <%=f.input :team_id, :as => :hidden, :input_html => {:value => params[:id]}%> <div class="well"> <%= f.button :submit, :class => 'btn-primary icon-plus-sign btn-success', :value => "Add To Team" %> </div> <%end%> </div> </code>
Die Parameter, die ich an die Steuerung sende:
<code>"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"} </code>
Controller, der die Speicherung abwickelt:
<code>def player_added @team = Team.find(params[:id]) #where the issue is happening @roster = @team.rosters.build(params[:roster]) @roster.save ... end </code>
Ich habe eine Arbeit um die Verwendung der Parameter,ABER Ich möchte verstehen, was ich hier für zukünftige / Lernzwecke falsch mache und warum es mir gibt: Kann geschützte Attribute nicht massenweise zuweisen
Meine Arbeit um (irgendwie hacky):
<code>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 </code>
Ich benutze Simple_Form 2.0 ...
Ich weiß, das sind viele Informationen, aber ich danke Ihnen im Voraus!
LÖSUNG
Nur für den Fall, dass jemand anderes dasselbe / ein ähnliches Problem hat wie ich ...
Ich habe dieses Plugin installiert =>https://github.com/ryanb/nested_form
Das sind also die Änderungen, die ich vorgenommen habe:
Roster.rb
<code>class Roster < ActiveRecord::Base belongs_to :team has_many :rosterizes has_many :players, :through => :rosterizes accepts_nested_attributes_for :players attr_accessible :jersey_number, :class_year, :players, :player_attributes end </code>
Ich habe auch die Ansicht geändert, um:
<code> <%= simple_nested_form_for @roster, :url =>player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %> <%= f.simple_fields_for :players, @roster.players.build do |x| %> # nested form ... <%end%> # form ... <%end%> </code>
Regler zu speichern def player_added
<code>@team = Team.find(params[:id]) @roster = @team.rosters.build(params[:roster]) @roster.save ... </code>
Ende
Dies war für mich ein schmerzhaftes Problem zu verstehen. Hoffentlich verkürzt dies die Zeit für jeden von euch, der nach Antworten sucht / nested_forms lernt!