2015-02-24 43 views
0

用will_paginate或Kaminari可以与范围和CanCanCan分页。 How to do pagination with cancan?用CanCan块分页

但是,这只解释了如果你的CanCan能力使用哈希如何做到这一点。如果你使用一个块,这将不起作用。我理解这一点,因为哈希转换为SQL语句。我似乎无法想象用block语句来做这件事的方法。

例如:

can :read, Shipment do |shipment| 
    user.client_ids.include? shipment.client_id 
end 

用户只能看货,如果客户在他们的客户名单。

@shipments = Shipment.ransack(params[:q]).result.uniq.paginate(page: params[:page]).select { |shipment| can? :show, shipment } 

一种方法来做到这一点,并返回您的记录数组。但will_paginate需要分页对象。

<%= will_paginate @shipments %> 

will_paginate将barf全部。也许这会在Kaminari工作?

谢谢!

回答

0

也许更好的办法就是在块上使用散列。无论如何它效率更高。 (https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities#hash-of-conditions

我将我块哈希

can :read, Shipment, client_id: user.client_ids 

而且在我的查询链(https://github.com/CanCanCommunity/cancancan/wiki/Fetching-Records

@shipments = Shipment.accessible_by(current_ability, :show).ransack(params[:q]).result.uniq.paginate(page: params[:page]) 

它精美的作品。