2015-08-31 2 views
0

Я использую Rails 4, devise, Role Model и CanCanCan.Rails - CanCanCan - общие возможности

Возможно ли определить способность в способности. Rb, что является общим для ряда ролей?

Например, каждый зарегистрированный пользователь может CRUD создать собственную страницу своего профиля? И тогда роли обладают определенными способностями поверх этой общей способности?

Как это работает? Нужно ли мне создавать роль в модели ролей для общих способностей, а затем разрешать каждому пользователю иметь несколько ролей, чтобы они получали общие способности, а также специфические роли?

К примеру, в моем ability.rb, у меня есть:

class Ability 
    include CanCan::Ability 

    def initialize(user) 

     alias_action :create, :read, :update, :destroy, :to => :crud 


    # Define abilities for the passed in user here. For example: 
    # 
    user ||= User.new # guest user (not logged in) 

     #users who are not signed in can create registration or login 

     # can read publicly available projects, programs and proposals 
     can :read, Project, {:active => true, :closed => false, :sweep => { :disclosure => { :allusers => true } } } 

     # {:active => true, :closed => false && :Project.sweep.disclosure.allusers => true} 
     # if user role is student 

     if user_signed_in? 
     can :crud, Profile, :user_id => user.id #[for themselves] 


     elsif user.try(:profile).present? && user.profile.has_role?(:student) 

Итак, я хочу, чтобы студенты, чтобы иметь возможность читать одни и те же вещи, что гости могут читать. Есть ли способ сказать, что учащиеся могут делать все, что могут сделать новые пользователи и пользователи, которые вошли в систему (а также особые способности учащегося)?

ответ

1

Вы можете сделать вид композиции в ваших ролей через вызовы функций, как этот

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Define abilities for the passed in user here. For example: 
    # 
    user ||= User.new # guest user (not logged in) 

     #users who are not signed in can create registration or login 

     # can read publicly available projects, programs and proposals 

     # {:active => true, :closed => false && :Project.sweep.disclosure.allusers => true} 
     # if user role is student 

     if user_signed_in? 
     if user.try(:profile).present? && user.profile.has_role?(:student) 
      student 
     else 
      authenticated 
     end 
     else 
     anonymous 
     end 
    end 

    def anonymous 
     can :read, Project, {:active => true, :closed => false, :sweep => { :disclosure => { :allusers => true } } } 
    end 

    def authenticated 
    anonymous 
    can :crud, Profile, :user_id => user.id #[for themselves] 
    end 

    def student 
    authenticated 
    #other student abilities 
    end 
    #other roles follow the same principal 
    def teacher 
    authenticated 
    end 
end 

The authenticated функция будет содержать общие способности к любой роли и каждой роли, которую необходимо будет просто позвонить (это своего рода наследование, когда любой студент может делать то, что может пройти аутентифицированный пользователь, плюс его способности)

0

Я здесь добавить пример класса способности для понимания. Вы легко можете понять код и прочитать комментарии. Ваш код кажется не очень хорошим, я могу указать одну вещь, вам не следует управлять ролью через profile, вы должны использовать user для назначения или управления roles.

Если вы хотите предоставить такую ​​же возможность группе пользователей, вы можете использовать этот тип || условие user.has_role?(:role_one) || user.has_role?(:role_two) и передать способный блок как can :manage, [SomeClassName, SomeClassName].

class Ability 
     include CanCan::Ability 

     def initialize(user) 

     user ||= User.new 

     #Only same user can mange his Profile 
     can :manage, [Profile], :user_id => user.id 

     #Give rule wise permission 
     if user.admin? 
      can :manage, :all 
     elsif user.has_role?(:some_role_name) 
      can :manage, [SomeClassName] 
     elsif user.has_role?(:role_one) || user.has_role?(:role_two) 
      can :manage, [SomeClassName, SomeClassName] 
     else 
      can :read, :all 
     end 

     end 
    end 

Надеюсь, это поможет вам выполнить свою задачу.

+0

Привет, Рокибул, боюсь, я не понимаю, что означает ваш пример. Вы имеете в виду, что для общих способностей мне нужно указать все роли, которые могут иметь возможность, в отличие от определения способности и включения этой способности в другую роль, которая также может использовать эту способность. Я также боюсь, что не понимаю, почему у меня нет способностей в profile.rb. Это намеренно, так как у 1 пользователя может быть много профилей. Извините, но я не понимаю ответа, который вы поделили. – Mel

+0

Прошу прощения за то, что вы не можете понять пример кода. Но одна вещь, я не заставил вас указывать, что у вас есть несколько профилей для одного пользователя для нескольких ролей, вы можете назначить несколько ролей для одного пользователя напрямую, а не через профиль, это будет беспорядок, я думаю, во всяком случае удачи :) –

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