1

У меня есть приложение для баскетбола, в котором у реестродержателя много игроков, а игрок может быть на нескольких списках. (Причина для многих ко многим архив игрока-Учетный)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!

+0

'accepts_nested_attributes_for: players' – DGM

ответ

3

Проблема с тем, как вы именованием вложенного атрибута ассоциации, и с параметрами, которые вы отправляете:

Атрибут для вложенного :players должен быть :players_attributes и :team_id не должно быть перечислены (потому что переопределяет команда ассоциации рельсы магии):

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

Обратите внимание, что вам не нужно включать атрибут "team_id" в параметрах для "roster", потому что вы уже загружаются и привязывают к нему реестром.

+0

Я внесла изменения, но теперь у меня появляется новая ошибка, проверьте мои изменения. Извините, если мои вопросы/вопросы наивны, мой опыт работы с рельсами - это начинающий, умеренный, первый раз работающий с вложенными формами. Спасибо за ваш вклад и помощь! – mrcolombo

+0

accepts_nested_attributes_for: игроки должны были остаться неизменными, только часть attr_accessible, необходимая для изменения – PinnyM

+0

Сделано изменение, похоже, распознает вызов 'simple_nested_from_for' http://i.stack.imgur.com/hU7Dx.png, также исправлено мое редактирование выше того, что вы изначально имели в виду. – mrcolombo