2015-12-15 29 views
0

CanCanCan對於某些人來說可能是一個明顯的問題,但是我發現很難將其包圍。對CanCanCan使用CanCanCan來隱藏/顯示內容 - 建議

我得到了一個有許多角色的應用程序(campus_rep,campus_manager,operations_manager,admin等)。他們都有權訪問「管理員」部分,但會根據角色查看不同的菜單選項。

例如:

  • 管理員可以管理所有的客戶「
  • 運營經理可以管理客戶,他們屬於

提取物ability.rb

if user.role == 'admin' 
    can  :manage, JobApplication 
elsif user.role == 'operations_manager' 
    can  :manage, JobApplication,  school_id: user.schools.map(&:id) 
elsif ser.role == 'campus_rep' 
    # blah but nothing to do with JobApplication 
end 

學校我一直在想用if can? :manage, Customer bu那麼即使'operations_managers'也不會通過它,這是有道理的。

建議如何擺脫類似的情況?

我試過if can? :manage, Customer.new(school: current_user.schools.first)哪種有用但看起來不太好。

我雖然做了一些事情,比如將'admin'和'operations_managers'加入can :see, JobApplication,然後進行如if can? :see, JobApplication這樣的檢查。

建議什麼?有沒有更好的方法?希望有...

也高度此事

回答

1

你的代碼中提到JobApplications但你的問題主要是關於客戶的讚賞任何意見:我來談談客戶,但原則是任何同模型。

如果我理解正確,您的目標是將一羣客戶傳遞給您的觀點。但您只希望視圖向那些允許您的用戶(稱爲運營經理)的客戶展示。

在這種情況下,您的控制器或視圖模板代碼可以根據能力過濾客戶。所以,你會做這樣的事情

@customers = Customer.find_each.select { |cstmr| current_user.can? :manage, cstmr } 

這將是相當緩慢的,如果有很多的客戶,所以一些程序員會試圖繞過cancancan和設計數據庫查詢,而不是。例如,您可以查詢屬於特定學校的所有客戶的數據庫。

您的主要誤解是您正在嘗試基於類來測試功能。但是,您的規則基於單個對象。這是正常的,所以正常的方法是測試每個實例。

參考:http://www.rubydoc.info/gems/cancancan/1.13.1#2__Check_Abilities___Authorization

+0

你知道像魔術的第二個問題,我有y'day。感謝你的回答。 –

+0

嗯......我明白了,有些事情實際上會起作用...... –