无法批量分配受保护的属性。 (已设置attr_accessible)

时间:2012-03-23 15:54:38

标签: ruby-on-rails ruby activerecord ruby-on-rails-3.2 simple-form

我制作拼车应用程序。当我想创建一个新的Route时,我有这个错误:

ActiveModel::MassAssignmentSecurity::Error in RoutesController#create
Can't mass-assign protected attributes: place_ids

模型看起来像这样:

class Route < ActiveRecord::Base
  #  id             :integer         not null, primary key
  #  start_place_id :integer
  #  end_place_id   :integer
  #  start_time     :datetime
  #  end_time       :datetime
  #  car_id         :integer
  belongs_to :car
  has_many :places
  has_and_belongs_to_many :users
  attr_accessible :start_place_id, :end_place_id, :start_time, :end_time, :car_id
end

class Place < ActiveRecord::Base
  has_many :routes
  attr_accessible :name, :address, :lat, :long, :description
end

class Car < ActiveRecord::Base
  has_many :routes
  attr_accessible :car_type, :license_plate, :seats_num, :motorway_vignette_expeier
end

路线 _form.html.erb 如下所示:

<%= simple_form_for @route do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <%= f.association :places %>
  <%= f.association :places %>
  <%= f.input :start_time %>
  <%= f.input :end_time %>
  <%= f.association :car %>
  <%= f.button :submit %>
<% end %>

日志正在写这个:

Started POST "/routes" for 127.0.0.1 at 2012-03-23 15:41:37 +0100
Processing by RoutesController#create as HTML
  Parameters: {"utf8"=>"✓", "route"=>{"place_ids"=>["", "4", "", "1"], "start_time(1i)"=>"2012", "start_time(2i)"=>"3", "start_time(3i)"=>"23", "start_time(4i)"=>"14", "start_time(5i)"=>"41", "end_time(1i)"=>"2012", "end_time(2i)"=>"3", "end_time(3i)"=>"23", "end_time(4i)"=>"14", "end_time(5i)"=>"41", "car_id"=>"1"}, "commit"=>"Create Route"}
Completed 500 Internal Server Error in 1ms

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: place_ids):
  app/controllers/routes_controller.rb:15:in `new'
  app/controllers/routes_controller.rb:15:in `create'

我不明白,为什么它为place_ids创建一个4元素的长数组(“place_ids”=&gt; [“”,“4”,“”,“1”],)。 我不明白,为什么它写了MassAssignment,当我在模型attr_accessible中写道... 我在rails 3.0.0中做了类似的工作。我认为simple_form改变了一些东西...... 他为什么写place_ids?为什么不start_place_id和end_place_id?

我将整个项目上传到github:https://github.com/Koli14/telekocsi2

环境是:

ruby​​ 1.9.2p290

Rails 3.2.1

simple_form(2.0.1)

Ubuntu 11.10

3 个答案:

答案 0 :(得分:1)

当你在模型中使用attr_accessible时,你告诉Rails只能通过质量分配来接受这些属性。

为了分配任何其他属性,您必须在代码中专门设置它。

但是,正如我可以通过您的代码看到的那样,您想要为地点has_many关联指定值。在这种情况下,您可以尝试使用accepts_nested_attributes_for,因此模型将接受详细信息。

答案 1 :(得分:1)

你可能想要明确的开始和结束位置:

class Route < ActiveRecord::Base
  belongs_to :car
  has_one :start_place, :class => "Place", :foreign_key => "start_place_id"
  has_one :end_place, :class => "Place", :foreign_key => "end_place_id"
  has_and_belongs_to_many :users
  attr_accessible :start_place_id, :end_place_id, :start_time, :end_time, :car_id
end

以及:

<%= simple_form_for @route do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <%= f.association :start_place %>
  <%= f.association :end_place %>
  <%= f.input :start_time %>
  <%= f.input :end_time %>
  <%= f.association :car %>
  <%= f.button :submit %>
<% end %>

答案 2 :(得分:0)

我想你可能想再看一下你的联想。在我看来,一条路线应该属于一个终点并属于一个起点而不是有很多地方(除非你包括航路点)。可能是这种情况的线索是路线模型中的外键。