2014-01-18 79 views
3

我正在使用CanCan並一直在研究如何開始。然而,似乎大多數教程並不是非常具體,並且不適合我自己的需求。我正在構建一個社交網絡,用戶可以在其中創建項目並將其他用戶添加到他們的項目中,從而允許這些用戶調節該項目。如何使用CanCan與角色模型

我目前有一個Role模型帶有字符串屬性,User模型來自devise。我從哪裏出發?

我看過this post,但它沒有完全說明如何設置角色以及角色模型和CanCan中的ability.rb文件之間的關係。

如果您需要我更具體,請說出口!我不是最偉大的Rails開發;)

編輯

我看到的這個railscast,並且它不具有獨立的榜樣,我想有。我嘗試過使用Rolify,但人們都說它太複雜了,而且可以用更簡單的方式來完成。我也遇到了一些困難,所以我想用我自己的角色模型。

編輯

我目前使用rolify和角色的工作。我發現我的解決方案在:https://github.com/EppO/rolify/wiki/Tutorial

+0

http://railscasts.com/episodes/192-authorization-with-cancan嘗試觀看本教程 – Pierre

+0

在能夠提供任何有用答案之前,我們確實需要了解更多關於您嘗試的內容去做。也許從描述「用戶」和「角色」模型開始,以及它們如何與您試圖驗證的其他模型進行交互。 – Jon

回答

6

如果您的用戶角色的東西正在尋找類似以下內容:

class User < ActiveRecord::Base 
    has_many :user_roles 
    has_many :roles, :through => :user_roles 

    # user model has for example following attributes: 
    # username, email, password, ... 
end 

class Role < ActiveRecord::Base 
    has_many :user_roles 
    has_many :users, :through => :user_roles 

    # role model has for example following attributes: 
    # name (e.g. Role.first.name => "admin" or "editor" or "whatever" 
end 

class UserRole < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

你可以做到以下幾點:

首先,用一些輔助的方法延長您的用戶模型或類似的東西:

class User < ActiveRecord::Base 

    def is_admin? 
    is_type?("admin") 
    end 

    def is_editor? 
    is_type?("editor") 
    end 

    def is_whatever? 
    is_type?("whatever") 
    end 

    private 

    def is_type? type 
    self.roles.map(&:name).include?(type) ? true : false # will return true if the param type is included in the user´s role´s names. 
    end 

end 

其次,擴大你的能力類:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user 
     can :manage, :all if user.is_admin? 
     can :create, Project if user.is_editor? 
     can :read, Project if user.is_whatever? 
     # .. and so on.. 
     # you can work with your different roles on base of the given user instance. 
    end 
    end 
end 

或者,您可以刪除您的用戶角色has-many-through關聯並將其替換爲easy-roles gem - 非常有用。它可以在github上獲得:https://github.com/platform45/easy_roles

現在你應該知道如何使用cancan,角色和所有的東西一起工作:-)。

+0

非常感謝您的回覆。我用rolify而不是簡單的角色,但他們做了幾乎相同的事情! – zenben1126

+1

答案有用/解決方案?如果是的話,你可以接受它;) – Mattherick

+0

抱歉已經爲考試而學習:) – zenben1126