Проблема с атрибутом attr_accessible в Rails Devise
-
27-10-2019 - |
Вопрос
Я пытаюсь добавить авторизацию разработчика в свое приложение rails 3. Все идет хорошо, за исключением того, что я также пытаюсь следовать этому руководству по динамической установке attr_accessible дляrole_ids только для пользователей-администраторов (я не хочу, чтобы обычные пользователи меняли свою роль, но администратор должен иметь возможность это сделать) ... проблема в том, что учебный подход railscast предполагает, что у меня есть доступ для изменения поведения контроллера, когда на самом деле разработкасправиться со всем этим под капотом.
Пожалуйста, помогите
Решение
Вы можете создать подкласс контроллеров Devise, вам просто нужно сгенерировать представления и переместить их в нужное место.Ознакомьтесь с разделами «Настройка представлений» и «Настройка контроллеров» в Readme-файле Devise.
В итоге я добавил role_ids в attr_accessible, затем создал подкласс RegistrationsController и добавил before_filter, чтобы удалить этот параметр для пользователей, не являющихся администраторами.
родовое слово Просто не забудьте добавить представления регистрации в /app/views/users/registrations/
.
Другие советы
Я нашел лучший способ справиться с этим - это RailsCast 237 .Он более подробный, чем ответ Arrel, но не заставляет вас добавлять роль (или другие поля) в attr_accessible.
Добавьте в инициализатор следующий метод:
родовое словоЗатем в вашем контроллере вы можете:
user.accessible=: роль, если можно?: set_role, ресурс
Этот вызов, к сожалению, должен быть выполнен после того, как пользовательский (или какой-либо другой) объект был создан.Это означает, что вам придется создать подкласс контроллера и вызвать его после создания экземпляра ресурса в update и create.
Это для Rails 3.2.В более ранних версиях я считаю, что метод mass_assignment_authorizer не принимает параметр.Атрибут attr_accessible без значений устанавливает отказоустойчивый отказ приложения для массового назначения.Это также можно сделать в файле application.rb с помощью
родовое слово