Я думаю, что нет проблем иметь одинаковую модель для всех типов пользователей. Вам нужно только определить роль пользователя, например, через столбец базы данных.
Но во многих случаях вам нужно больше, чем роль пользователя, чтобы запретить или разрешить доступ, вам необходимо проверить, например, запросил ли current_user текущий ордер. Так что вы можете сделать это:
Предположим, у вас есть эта модель:
class User < ActiveRecord::Base
devise :database_authenticatable, :confirmab...
...
def admin?
role == 'admin'
end
end
Таким образом, вы можете проверить роль пользователя с помощью некоторого метода в вашей модели, например admin?
.
Теперь вы можете использовать Can Can для авторизации, как вы можете см. Здесь , как определить ваши способности.
Класс способностей:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
Понять, как работает CanCan, очень важно: посмотрите здесь .
Предположим, вы хотите получить параметры в свой класс способностей, который позволяет вам проверять объекты в вашей базе данных перед загрузкой страницы, разрешая или не предоставляя пользователю доступ. В вашем файле application_controller поместите что-то вроде этого:
...
def current_ability
@current_ability ||= Ability.new(params, current_user)
end
...
В ваших силах изменить аргументы метода инициализации и использовать params
по мере необходимости:
class Ability
include CanCan::Ability
def initialize(params, user)
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
else
# Verify the record for atuhorization
can :manage, Order if Order.find(params[:id]).requester_id == user.id
end
end
end