2013-04-02 2 views
0

У меня есть Rails Admin с поддержкой CanCan в моем приложении rails. Тем не менее, я запутался в одном вопросе. Как CanCan знает, во что подписали пользователь? Например, мои пользователи могут иметь разные роли, а через CanCan я назначаю роли для определенного доступа в каждую таблицу. Когда я иду в localhost:3000/admin, я получаю ошибкуПонимание способности и пользователей CanCan

CanCan::AccessDenied in RailsAdmin::MainController#dashboard 

Мой Ability.rb файл

def initialize(user) 
    if user and user.role.eql? :super_admin 
     can :manage, :all    # allow superadmins to do anything 
    elsif user and user.role.eql? :admin 
     can :manage, [Location, School] # allow admins to manage only Locations and Schools 
    end 
    end 

Так что мне делать, так что пользователя есть возможность зарегистрироваться в в Rails администратора? Нужно ли вручную создавать его?

ответ

1

В вашем контроллере должен быть установлен способ current_user. Предполагая, что у вас это есть, если вы не подписаны, у вас не будет доступа к текущему пользователю, поэтому вам нужно назначить пользователя в файле возможностей, если он не существует. В вашем методе initialize добавьте user ||= User.new, чтобы выполнить присвоение, если пользователь еще не существует.

def initialize(user) 
    user ||= User.new 

    if user and user.role.eql? :super_admin 
    can :manage, :all    # allow superadmins to do anything 
    elsif user and user.role.eql? :admin 
    can :manage, [Location, School] # allow admins to manage only Locations and Schools 
    end 
end 
+0

Ahh. Я думал, что это возможно, но не может проверить в документах. Благодарю. – jason328

+0

Без проблем, @ jason328! Рад, что смог помочь! –

2

По умолчанию CanCan будет использовать то, что возвращается current_user. Если вы используете Devise в пространстве имен, хотя (например, admin), тогда Devise фактически будет использовать current_admin_user. Вы можете либо создать метод current_user в вашем ApplicationController (или каком-то другом базовом контроллере), который возвращает current_admin_user, либо перезаписать метод current_ability, чтобы вместо этого создать свойство с помощью current_admin_user.

(это все предполагается, что ваш Разрабатывают использует пространство имен. По умолчанию Devise будет использовать current_user)

Смежные вопросы