2014-01-17 66 views
0

目前我的導航部分如下。CanCan鏈接助手

- if (can? :manage, Invoice) and (can? :manage, InvoiceItem) 
    %li{class: is_active?(["invoices", "invoice_items"])} 
    = link_to invoices_path do 
     %i.icon-file-text 
     Invoices 

我看到定義能力的can方法可以接受一個數組。有沒有辦法制作罐頭?輔助方法更簡潔?

UPDATE:我寫了一個小的應用程序助手來解決這個問題。這是最好的方法嗎?

def user_can?(actions, resources) 
    actions.each do |action| 
    resources.each do |resource| 
     return false if cannot? action, resource 
    end 
    end 
    true 
end 

而在部分:

- if user_can? [:manage], [Invoice, InvoiceItem] 
    %li{class: is_active?(["invoices", "invoice_items"])} 
    = link_to invoices_path do 
     %i.icon-file-text 
     Invoices 
+0

結帳這個問題:http://stackoverflow.com/questions/5446654/how-do-i-use-cancan-to-authorize-an-array-of-resources – benjaminjosephw

+0

這是爲了定義能力,對吧?我希望看到幫助者方法。我可能最終會寫一個,但在這之前想到檢查。 –

+0

你自己的解決方案看起來不錯。如果你只是在尋找一些東西來整理你的觀點,而且看起來好像可以完成這項工作! – benjaminjosephw

回答

0

can?正如你指出只計算一個動作,一個資源在同一時間。假設您不需要檢查操作和資源的不同組合,而您通常不會在視圖中的單個條件語句中執行這些操作和資源組合,那麼您的幫助程序就沒有問題。

您可能還想考慮在決定是否顯示Invoice s列表時,爲什麼您確實需要檢查:manageInvoiceItem的訪問。

+0

我必須這樣做有兩個原因。其中一個,儘管我爲發票項目使用了嵌套資源,但我將發票項目選擇保存在單獨的頁面(如嚮導工作流程)和控制器中以支持該項目。其次,菜單分組(如交易和主人),這也是必需的。會有太多可以嗎?當用戶點擊一個頁面時調用。如果可能的話,那就是我想減少的。 –