Пагинация с блоком CanCan

С помощью will_paginate или Kaminari вы можете разбивать на страницы с помощью областей видимости и CanCanCan. Объясняется здесь, Как выполнить разбиение на страницы с помощью канкана?

Но это только объясняет, как это сделать, если ваша способность CanCan использует хэши. Это не сработает, если вы используете блок. Что я понимаю, потому что хеш переводится в оператор SQL. Я просто не могу придумать, как это сделать с помощью оператора блока.

Например:

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 будет блевать по этому поводу. Может быть, это сработает в Каминари?

Спасибо!


person bfcoder    schedule 24.02.2015    source источник


Ответы (1)


Возможно, лучший способ — просто использовать хеш над блоком. В любом случае это эффективнее. (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])

И это прекрасно работает.

person bfcoder    schedule 24.02.2015