Я работаю над Rails 3.2, где я использую Devise для аутентификации. Я решил попробовать одностраничное наследование для управления ролями пользователей, но я быстро столкнулся с проблемой. В настоящее время у меня три модели пользователей, User < ActiveRecord
, Admin < User
и Collaborator < User
. Admin и Collaborator разделяют большинство столбцов пользователей, но они имеют несколько разные формы поведения и привилегии. Мои модели в настоящее время выглядят следующим образом:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :token_authenticatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :name, :password, :password_confirmation, :remember_me
before_save :ensure_authentication_token
[...]
end
class Admin < User
has_one :account, dependent: :destroy
attr_accessible :account_attributes
accepts_nested_attributes_for :account
end
class Collaborator < User
has_one :account
end
class Account < ActiveRecord::Base
attr_accessible :name
validates_presence_of :name
has_many :projects, dependent: :destroy
has_many :users
end
Проблема возникает при попытке аутентификации админов и соавторов в моем ProjectController (и других контроллерах, где мне нужна аутентификация):
# Causes problem, no one can access anything.
before_filter :authenticate_admin!
before_filter :authenticate_collaborator!
Аналогичная проблема, с которой я столкнулся, заключалась в разработке вспомогательных методов для ie. current_user, теперь у меня есть current_admin и current_collaborator, я "решил", создав перед фильтром и методом:
def set_current_user
@current_user = current_admin || current_collaborator
end
Есть ли аналогичное или простое решение для моей проблемы с аутентификацией с помощью Devise, или вы бы порекомендовали другой подход, чем однократное наследование, и что бы это было?
Моя цель: 1. Когда новые пользователи подписываются, они становятся админами, когда они создают свою учетную запись, также создается модель учетной записи. 2. Новый (администратор) пользователь может затем пригласить дополнительных пользователей на учетную запись, которая будет Collaborators. 3. Админы и соавторы должны иметь разные привилегии. Соавторы не будут создавать новые "Учетные записи" при регистрации (компания может быть лучшим именем для моей модели учетной записи), поэтому администратору и сотрудникам потребуется немного разные формы для регистрации и редактирования.
Спасибо.
Обновление
Я как бы "решил" его, создав аналогичный перед фильтром:
def authenticate!
if @current_user == current_admin
:authenticate_admin!
elsif @current_user == current_collaborator
:authenticate_collaborator!
end
end
Предложения по возможно более элегантным решениям по-прежнему будут оценены.