2013-02-20 47 views
0

我試圖解決用燦燦寶石的用戶的能力問題。 公司和用戶通過user_company_assignment進行關聯,使公司擁有許多用戶,並且用戶擁有並屬於許多公司 我想將公司的展示行爲僅限於與公司關聯的用戶。下面是兩個模型的代碼和一個能夠爲初始化角色繼承和賣方用戶的方法的能力分析器,但這不起作用,它總是向我顯示公司的細節。鐵軌和康康 - 如何通過協會限制公司展示行動給用戶在has_many

Company.rb

has_many :user_company_assignments 
has_many :user, :through => :user_company_assignments 

User.rb

has_many :user_company_assignments 
has_many :companies, :through => :user_company_assignments 

Ability.rb

def initialize(user) 
    @user = user || User.new # for guest 
    @user.roles.each { |role| send(role.name.downcase) } 
end 

def seller 
    can :manage, :all 
    cannot :destroy, :all 

    can :show, Company do |company| 
    company.user_ids.include? @user.id 
    end 
end 

回答

2

你的錯誤是由於能力優先:https://github.com/ryanb/cancan/wiki/Ability-Precedence

這條線將覆蓋所有以下能力:can :manage, :all

既然你已經指出,賣方可以管理所有的賣家可以執行任何種類的在公司上,不管其他can聲明。

一個解決方案是使用cannot,就像您對:destroy所做的那樣。它將覆蓋:manage, :all子句。

def seller 
    can :manage, :all 
    cannot :destroy, :all 
    cannot :show, Company do |company| 
    !company.user_ids.include? @user.id 
    end 
end 
+0

它的偉大工程!謝謝Jesper! – davelab 2013-02-20 14:35:17

0

你需要調用load_and_authorize_resource方法在您的控制器。

0

好加斯帕,我已經改變了我的ability.rb和它的作品,但我不知道這是設置能力的最佳方法,它是怪我需要指定每個模型賣家有表演行動的許可。告訴我,如果是做到這一點的最好辦法:

Ability.rb

def seller 
    can [:index, :create], :all 
    cannot :destroy, :all 

    can :show, Company do |company| 
    company.user_ids.include? @user.id 
    end 

    can :show, [Report, Client] 

end 
+0

您是否閱讀我的編輯?你可以用'cannot'覆蓋'can:manage,:all' – Jesper 2013-02-20 12:01:46