Лучший способ справиться с этим я нашел из RailsCast 237 . Это более многословно, чем ответ Аррела, но не заставляет вас добавлять роль (или другие поля) в attr_accessible.
Добавьте следующий метод в инициализатор:
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible
private
def mass_assignment_authorizer(role = :default)
if accessible == :all
self.class.protected_attributes # hack
else
# super returns a whitelist object
super + (accessible || [])
end
end
end
Тогда в вашем контроллере вы можете сделать:
user.accessible =: роль, если можете? : set_role, ресурс
Этот вызов, к сожалению, должен быть сделан после того, как был создан экземпляр пользовательского (или любого другого) объекта. Это означает, что вам придется создать подкласс контроллера и вызывать его после создания экземпляра ресурса при обновлении и создании.
Это для Rails 3.2. В более ранних версиях я считаю, что метод mass_assignment_authorizer не принимает параметр. Attr_accessible без значений устанавливает отказоустойчивый отказ приложения для массового назначения. Это также можно сделать в файле application.rb с помощью
config.active_record.whitelist_attributes = true