Rails Devise attr_accessible задача - PullRequest
1 голос
/ 31 января 2011

Я пытаюсь добавить разработку авторизации в мое приложение rails 3. Все идет хорошо, за исключением того, что я также пытаюсь следовать этому руководству по динамической установке attr_accessible для role_ids только для пользователей с правами администратора (я не хочу, чтобы обычные пользователи меняли свою роль, но администратор должен иметь возможность это делать) .. Проблема в том, что метод обучения Railscast предполагает, что у меня есть доступ, чтобы изменить поведение контроллера, когда фактически устройство обрабатывает все это под капотом.

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Вы можете создать подкласс контроллеров Devise, вам просто нужно сгенерировать представления и переместить их в правильное место.Прочтите «Конфигурирование представлений» и «Конфигурирование контроллеров» в readme для Devise.

В итоге я добавил role_ids в attr_accessible, затем создал подклассы RegistrationsController и добавил before_filter, чтобы удалить этот параметр для не-администраторов.

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :remove_admin_params, :only => [:create, :update]

protected
  # disable setting the role_ids value unless an admin is doing the edit.
  def remove_admin_params
    params[:user].delete(:role_ids) unless current_user.try(:admin?)
  end
end

Просто добавьте виды регистрации в /app/views/users/registrations/.

0 голосов
/ 20 августа 2012

Лучший способ справиться с этим я нашел из 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
...