Подтвердить что ты не робот

ActiveModel:: MassAssignmentSecurity:: Ошибка: невозможно назначить защищенные атрибуты

Если я попытаюсь выполнить следующий код:

hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")

Я выполняю следующую ошибку:

Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
 ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: type

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

4b9b3361

Ответ 1

Несколько вещей:

Массовое присвоение обычно означает передачу атрибутов в вызов, который создает объект как часть хэша атрибутов. То есть вы передаете кучу атрибутов в хэш в вызов, который создает новый объект. Например:

@user = User.create({:name => "My name", :user_type => "nice_user"})

Однако Rails включает некоторые базовые правила безопасности, которые означают, что не все атрибуты могут быть назначены таким образом по умолчанию. Вы должны указать, какие из них можно сделать заранее. Вы делаете это так:

class User < ActiveRecord::Base
  attr_accessible :name, :user_type
end

Если вы не указали атрибут attr_accessible, и вы передаете его для создания объекта, вы получите сообщение об ошибке.

Подробнее:

http://api.rubyonrails.org/v3.2.9/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

Альтернативой является установка некоторых атрибутов при первом создании записи и установка других после - так:

# In this example `user_type` is not attr_accessible so it needs to be set specifically
@user = User.create({:name => "My name"})
@user.user_type = "nice_user"
@user.save

Кроме того, если у вас возникли проблемы с использованием имени столбца type, потому что rails запутывается и думает, что вы хотите использовать Single Table Inheritance (STI), проверьте ответ на этот вопрос, чтобы узнать, как обойти it: http://guides.rubyonrails.org/

Ответ 2

Работаете ли вы с Rails 3.2, следуя учебному пособию 3.1, например, прагматичному программисту "Agile Web Development with Rails" 4-го издания? Затем проверьте http://guides.rubyonrails.org/3_2_release_notes.html.

Ваша проблема в том, что с Rails 3.1 до 3.2 проверка защиты массового присвоения для моделей Active Record по умолчанию установлена ​​на "strict". Прокомментируйте соответствующие строки в этих файлах:

config/environments/development.rb
config/environments/test.rb

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

Ответ 3

  • Попробуйте: откройте config/application.rb

  • Найдите строку config.active_record.whitelist_attributes = true

  • Измените true на false

Тогда вы будете в порядке.

PS: не забудьте перезапустить консоль рельсов.

Ответ 4

Вы должны получить другую ошибку, например: column 'type' зарезервирован для хранения класса в случае наследования. Потому что Column 'type' не следует использовать в активной базе данных записей.

Ответ 5

Здесь представлена ​​некоторая информация о том, какое массовое назначение в Rails и почему защита существует. Это довольно легко обойти, когда вы действительно хотите назначить защищенный атрибут, но он берет пару дополнительных строк.

hassle = rota.hassles.build(:sender => user1, :receiver => user2)
hassle.type = 'sms'
hassle.save

Ответ 6

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

class Foo < ActiveRecord::Base
  # disables mass-assigment
  attr_protected
end

Это в основном устанавливает attr_protected для пустого массива ([])