2013-02-21 1 views
6

Пользователь может принадлежать многим организациям. Я хотел бы, чтобы Пользователь мог иметь разные роли/полномочия для каждой из принадлежащих ей организаций.Rails: использование CanCan для назначения нескольких ролей пользователям для каждой организации, к которой они принадлежат?

Например, пользователь "kevin" может принадлежать организации "stackoverflow" и "facebook." kevin должен быть администратором для stackoverflow и регулярным членом (читать + писать) для facebook.

Однако жемчужина CanCan, по-видимому, относится к ролям пользователей для одной организации. Я все еще новичок, но из того, что я могу собрать, камень CanCan предполагает, что роли пользователя связаны только с основным приложением.

Как я могу назначить отдельные роли для разных организаций, предпочтительно используя камень CanCan?

ответ

8

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

class User 
    has_many :roles 
end 

class Role 
    belongs_to :user 
    belongs_to :organization 
    attr_accessible :level 
end 

class Ability 
    def initialize(user) 
    can :read, Organization 
    can :manage, Organization do |organization| 
     user.roles.where(organization_id:organization.id,level:'admin').length > 0 
    end 
    can :write, Organization do |organization| 
     user.roles.where(organization_id:organization.id,level:'member').length > 0 
    end 
    end 
end 
+0

Я попытался применить это, но у меня все еще есть проблемы. Я очень благодарен за помощь: http://stackoverflow.com/questions/18482747/rails-how-to-split-separate-cancan-roles-user-has-many-roles-depending-on-sin – kibaekr

2

у нас есть что-то вроде этого. решение заключается в переопределении метода current_ability. в вашем случае у вас, вероятно, есть таблица соединений для пользователей и организации. назовем это user_organizations. В этой таблице соединений вы, вероятно, также сохраняете роль пользователя для определенной организации, не так ли? Итак, давайте использовать эту таблицу для определения текущей способности. В контроллере приложения

def current_ability 
    # assuming you have a current_user and current_organization method 
    Ability.new UserOrganization.where(user_id: current_user.id, organization_id: current_organization.id).first 
end 

# ability.rb 
class Ability 
    include CanCan::Ability 
    def initialize(user_organization) 
    user_organization ||= UserOrganization.new 

    case user_organization.role 
    when 'admin' 
    when '...' 
    when nil 
     # for users not a member of the organization 
    end 
    end 
end 

надеюсь, что это дает вам некоторое представление о

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