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

创建 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"}
4

2 回答 2

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

问题就在这里。params[:boxscores]包含两个boxscores。而你正在尝试创建一个。应该是这样的:

params[:boxscores].each do |k, bs|
  @boxscore = Boxscore.new(bs)
  # ...
end
于 2012-05-06T13:13:49.497 回答
0

现在您已经发布了参数,它使问题更加清晰。

您可以在下面看到您从表单中发布了2 个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 哈希将帮助您了解正在发生的事情。

您的参数以更清晰的 JSON 格式散列:

{
  "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" 
}
于 2012-05-06T15:59:25.480 回答