Есть ли какой-нибудь учебник для Rails 3.2, в котором рассказывается о назначении атрибута администратора пользователю?

Отказ от ответственности: я использую Rails 3.2. В частности, в книге «Rails 3 в действии»:

Модель пользователя имеет attr_accessible attr_accessible :email, :password, password_confirmation, :remember_me

Модель пользователя НЕ имеет :admin в списке, поэтому она не может быть массово назначена как часть params[:user].


The form_for block inside app/views/admin/users/_form.html.erb sets up a checkbox element to allow an admin to set a user as an admin:

` <%= f.check_box :admin %> <%= f.label :admin, "Is an admin?" %>


Приложение/controllers/admin/users_controller.rb

@user = User.new(params[:user])
@user.admin = params[:user][:admin] == "1"  
if @user.save

Строка @user.admin = params[:user][:admin] == "1" должна установить для атрибута admin значение true, но генерирует ошибки массового назначения, которые не позволяют мне изменить атрибут @user.admin на true.


Я могу установить для атрибута admin значение true без массового назначения через консоль, а также определить метод в модели пользователя:

def make_admin
  self.admin = true
end

Это выполняет то же самое, ничего особенного.

Как мне установить для атрибута администратора значение TRUE, чтобы пользователь мог работать с представлением и контроллером с помощью флажка?

Есть ли способ удалить или отделить параметр admin от params[:user][:admin])?


person Joe C    schedule 15.03.2012    source источник


Ответы (2)


Комментирование строки config.active_record.mass_assignment_sanitizer = :strict в файле development.rb продвинуло меня вперед.

person Joe C    schedule 16.03.2012

Плохая идея комментировать защиту от массового присвоения.

Почему бы вам не добавить :admin в список attr_accessible, если вы хотите, чтобы он был назначен массово?

И для информации, когда вы вводите это:

@user = User.new(params[:user])
@user.admin = params[:user][:admin] == "1"  
if @user.save

Не @user.admin = ... выдает ошибку массового присваивания, а строка User.new(params[:user])

В любом случае, если вы хотите получить значение флажка, но не хотите его массово назначать, попробуйте следующее:

admin = params[:user].delete(:admin)
@user = User.new(params[:user])
@user.admin = admin == "1"  
if @user.save

Не забудьте снова включить защиту от массового назначения ;)

person Byscripts    schedule 13.01.2013