Rails 3: добавление ролей пользователю - PullRequest
2 голосов
/ 07 января 2011

Я использую cancan в качестве механизма авторизации.

У меня уже есть роли в пользователе:

  ROLES = %w[admin normal author corp]

У меня также есть методы для добавления и проверки ролей:

#cancan
  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def is?(role)
    roles.include?(role.to_s)
  end

И у меня есть # roles_mask :integer в модели User.

Однако я хочу иметь after_save :add_normal_role, который назначает обычную роль пользователю.

По сути, яЯ не могу (не знаю), как назначать роли каждому пользователю.

Это то, что у меня есть, и это не работает:

private

  def add_normal_role
    self.roles=(ROLES[1])
  end

Спасибо

1 Ответ

2 голосов
/ 07 января 2011

Вы должны попытаться использовать обратный вызов before_create, чтобы убедиться, что у пользователя есть нормальная роль.

Проблема с вашим текущим обратным вызовом в том, что это after_save, ваши изменения не сохраняются по умолчанию.(Сохранение в обратном вызове after_save - плохая идея, приводящая к бесконечным циклам ...) Вы также можете использовать обратный вызов before_save (с тем же кодом, который у вас уже есть), который также будет работать.

Однако, поскольку вына самом деле нужно только добавить нормальную роль при создании объекта (а не при каждом обновлении), лучше подходит before_create.

...