2014-01-17 30 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

我必须这样做有两个原因。其中一个,尽管我为发票项目使用了嵌套资源,但我将发票项目选择保存在单独的页面(如向导工作流程)和控制器中以支持该项目。其次,菜单分组(如交易和主人),这也是必需的。会有太多可以吗?当用户点击一个页面时调用。如果可能的话,那就是我想减少的。 –