0

Avec will_paginate ou Kaminari, vous pouvez paginer avec des étendues et CanCanCan. Expliqué ici, How to do pagination with cancan?Pagination avec le bloc CanCan

Mais cela explique seulement comment le faire si votre capacité Cancan utilise des hachages. Cela ne fonctionnera pas si vous utilisez un bloc. Ce que je comprends parce que le hachage se traduit par une instruction SQL. Je ne peux pas sembler penser à un moyen de le faire avec une déclaration de bloc.

Par exemple:

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

L'utilisateur ne peut regarder l'expédition si le client est dans leur liste de clients.

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

Une façon de le faire et retourner un tableau de vos enregistrements. Mais will_paginate requiert l'objet pagination.

<%= will_paginate @shipments %> 

will_paginate va barf partout. Peut-être que cela fonctionnerait à Kaminari?

Merci!

Répondre

0

Peut-être le meilleur moyen est d'utiliser un hachage sur un bloc. C'est plus efficace de toute façon. (https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities#hash-of-conditions)

Je converti mon bloc à un hachage

can :read, Shipment, client_id: user.client_ids 

Et dans ma chaîne de requête (https://github.com/CanCanCommunity/cancancan/wiki/Fetching-Records)

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

Et il fonctionne à merveille.