Невозможно массово назначить защищенные атрибуты.(attr_accessible установлен) - PullRequest
0 голосов
/ 23 марта 2012

Я делаю приложение для автопарка. Когда я хочу создать новый маршрут, у меня появляется эта ошибка:

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'

Я не понимаю, почему он создает массив из 4 элементов для place_ids ("place_ids" => ["", "4", "", "1"],). И я не понимаю, почему пишут MassAssignment, когда я писал в модели attr_accessible ... Я сделал подобное в рельсах 3.0.0, и это сработало. Я думаю, что simple_form изменил что-то ... Почему он пишет place_ids? Почему бы не start_place_id и end_place_id?

Я загрузил полный проект на github: https://github.com/Koli14/telekocsi2

Окружающая среда:

ruby ​​1.9.2p290

Рельсы 3.2.1

simple_form (2.0.1)

Ubuntu 11.10

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Возможно, вам нужны явные начальные и конечные места:

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 %>
1 голос
/ 23 марта 2012

Когда вы использовали attr_accessible в своей модели, вы указали Rails принимать эти атрибуты только через массовое присвоение.

Чтобы назначить любой другой атрибут, вы должны специально установить его в своем коде.

Но, как я вижу по вашему коду, вы хотите присвоить значения местам ассоциации has_many.В этом случае, возможно, вы могли бы попытаться использовать accepts_nested_attributes_for, поэтому модель примет подробную информацию.

0 голосов
/ 23 марта 2012

Я думаю, вы, вероятно, хотите еще раз взглянуть на свои ассоциации Мне кажется, что маршрут должен принадлежать конечному месту и принадлежать начальному месту, а не иметь много мест (если вы не включаете путевые точки). Подсказка, что это может иметь место, - внешние ключи в вашей модели маршрута.

...