我制作拼车应用程序。当我想创建一个新的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
答案 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)
我想你可能想再看一下你的联想。在我看来,一条路线应该属于一个终点并属于一个起点而不是有很多地方(除非你包括航路点)。可能是这种情况的线索是路线模型中的外键。