2012-05-06 5 views
0

Я пытаюсь отправить форму с несколькими экземплярами класса Boxscore, и я продолжаю получать сообщение об ошибке «Нельзя назначать защищенные атрибуты: 0, 1»Невозможно назначить защищенные атрибуты:

Моя форма:

<%= form_for([@boxscore]) do |x| %> 
<% 2.times do |i| %> 
    <%= fields_for 'boxscores', Boxscore.new, :index => i do |f| %> 
     <div class="field"> 
     <%= f.label :game_id %><br /> 
     <%= f.number_field :game_id %> 
     </div> 
     <div class="field"> 
     <%= f.label :player_id, "Choose a player" %> 
     <%= f.select :player_id, Player.all.map{|t| [t.name, t.id]}, 
       { :include_blank => true } %> 
     </div> 
     <div class="field"> 
     <%= f.label :points %><br /> 
     <%= f.text_field :points %> 
     </div> 
     <div class="field"> 
     <%= f.label :rebounds %><br /> 
     <%= f.text_field :rebounds %> 
     </div> 
     <div class="field"> 
     <%= f.label :assists %><br /> 
     <%= f.text_field :assists %> 
     </div> 
     <div class="field"> 
     <%= f.label :blocks %><br /> 
     <%= f.text_field :blocks %> 
     </div> 
     <div class="field"> 
     <%= f.label :steals %><br /> 
     <%= f.text_field :steals %> 
     </div> 
     <div class="field"> 
     <%= f.label :turnovers %><br /> 
     <%= f.text_field :turnovers %> 
     </div> 
     <div class="field"> 
     <%= f.label :fgattempted %><br /> 
     <%= f.text_field :fgattempted %> 
     </div> 
     <div class="field"> 
     <%= f.label :fgmade %><br /> 
     <%= f.text_field :fgmade %> 
     </div> 
     <div class="field"> 
     <%= f.label :threepointattempted %><br /> 
     <%= f.text_field :threepointattempted %> 
     </div> 
     <div class="field"> 
     <%= f.label :threepointmade %><br /> 
     <%= f.text_field :threepointmade %> 
     </div> 
    <% end %> 
<% end %>  
<div class="actions"> 
    <%= x.submit %> 
</div> 
<% end %> 

Моя модель:

class Boxscore < ActiveRecord::Base 
    attr_accessible :boxscore_id, :assists, :blocks, :fgattempted, :fgmade, :game_id, :player_id, :points, :rebounds, :steals, :threepointattempted, :threepointmade, :turnovers 

    belongs_to :game 
    belongs_to :player 
end 

Мой контроллер:

def create 
    @boxscore = Boxscore.new(params[:boxscores]) 
    respond_to do |format| 
    if @boxscore.save 
     format.html { redirect_to @boxscore, notice: 'Boxscore was successfully created.' } 
     format.json { render json: @boxscore, status: :created, location: @boxscore } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @boxscore.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Мой PARAMS хэш при создании boxscore:

{"utf8"=>"✓", "authenticity_token"=>"JJI3di/InpEp4S6HktQWgVfyvk296M7upgQIQRPzJp8=", "boxscores"=>{"0"=>{"game_id"=>"2", "player_id"=>"1", "points"=>"11", "rebounds"=>"22", "assists"=>"11", "blocks"=>"11", "steals"=>"111", "turnovers"=>"22", "fgattempted"=>"3", "fgmade"=>"2", "threepointattempted"=>"11", "threepointmade"=>"22"}, "1"=>{"game_id"=>"2", "player_id"=>"3", "points"=>"3", "rebounds"=>"4", "assists"=>"3", "blocks"=>"55", "steals"=>"4", "turnovers"=>"3", "fgattempted"=>"3", "fgmade"=>"3", "threepointattempted"=>"3", "threepointmade"=>"3"}}, "commit"=>"Create Boxscore", "action"=>"create", "controller"=>"boxscores"} 
+0

Можете ли вы обновить пост, чтобы показать копию 'params' хэш, как это представляется с почтой? –

+0

Привет, Кевин. Я просто обновил сообщение с помощью bosxscore create params hash. Спасибо за помощь. – BC00

ответ

2
@boxscore = Boxscore.new(params[:boxscores]) 

Проблемы здесь. params[:boxscores] содержит два бокса. И вы пытаетесь его создать. Должно быть что-то вроде этого:

params[:boxscores].each do |k, bs| 
    @boxscore = Boxscore.new(bs) 
    # ... 
end 
+0

Привет, Серхио, вы могли бы посоветовать, что мне нужно будет добавить, чтобы сохранить оба бокса? – BC00

+0

Учитывая мой ответ и вопрос Кевина, что именно спрашивают? Чтобы дать вам рабочий код? –

+0

Мое понимание вышеизложенного заключается в том, что я повторяю через пары ключевых значений объекта: boxscores и затем создает новый экземпляр для каждого значения (bs)? Кажется, что это сработает для меня, но я совершенно новичок в этом, поэтому явно что-то не хватает. Еще раз спасибо. – BC00

0

Теперь, когда вы разместили параметры, проблема становится немного яснее.

Вы можете увидеть ниже, что Вы отправляете boxscore записи здесь от вашей формы - они определены в Params хэш как «0» и «1», которые являются двумя атрибутами, ActiveRecord говорит вам у него проблемы.

Решение либо делать, так как Sergio предлагает и обрабатывать их люблю:

params[:boxscores].each do |k, bs| 
    @boxscore = Boxscore.new(bs) 
    # ... 
end 

Или обработать их по отдельности, как две отдельные записи, как это:

@boxscore1 = Boxscore.new(params[:boxscores][0]) 
    @boxscore2 = Boxscore.new(params[:boxscores][1]) 

В общем, когда вы» у вас возникли странные проблемы с обработкой форм сообщений, хеш params поможет вам понять, что происходит.

Ваш PARAMS хэш в уборщика, формат JSON'd:

{ 
    "utf8"=>"✓", 
    "authenticity_token"=>"JJI3di/InpEp4S6HktQWgVfyvk296M7upgQIQRPzJp8=", 
    "boxscores"=>{ 
    "0"=>{ 
     "game_id"=>"2", 
     "player_id"=>"1", 
     "points"=>"11", 
     "rebounds"=>"22", 
     "assists"=>"11", 
     "blocks"=>"11", 
     "steals"=>"111", 
     "turnovers"=>"22", 
     "fgattempted"=>"3", 
     "fgmade"=>"2", 
     "threepointattempted"=>"11", 
     "threepointmade"=>"22" 
    }, 
    "1"=>{ 
     "game_id"=>"2", 
     "player_id"=>"3", 
     "points"=>"3", 
     "rebounds"=>"4", 
     "assists"=>"3", 
     "blocks"=>"55", 
     "steals"=>"4", 
     "turnovers"=>"3", 
     "fgattempted"=>"3", 
     "fgmade"=>"3", 
     "threepointattempted"=>"3", 
     "threepointmade"=>"3" 
    } 
    }, 
    "commit"=>"Create Boxscore", 
    "action"=>"create", 
    "controller"=>"boxscores" 
} 
Смежные вопросы