У меня есть приложение для баскетбола, в котором у реестродержателя много игроков, а игрок может быть на нескольких списках. (Причина для многих ко многим архив игрока-Учетный)Rails 3.1+ Вложенные формы Проблема: не удается назначить защищенные атрибуты
Roster.rb
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
Rosterizes.rb (плохо названный я знаю ...)
class Rosterize < ActiveRecord::Base
belongs_to :player
belongs_to :roster
attr_accessible :player_id, :roster_id
end
Player.rb
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
Взгляд
<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>
В PARAMATERS Я посылаю к контроллеру:
"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
Так это изменения, которые я изготовленный:
Реестр.Р.Б.
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
Я также внес изменения в целях:
<%= 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%>
контроллер, чтобы сохранить Защиту player_added
@team = Team.find(params[:id])
@roster = @team.rosters.build(params[:roster])
@roster.save
...
конец
Это была боль в стыке fo r me, чтобы понять, Надеюсь, это сократит время для любого из вас, кто ищет ответы/обучение nested_forms!
'accepts_nested_attributes_for: players' – DGM