Kaminari:: Метод ячеек paginate ничего не рендерит

Я использую гем Kaminari::Cells, и когда я использую метод paginate в представлении ячейки, ничего не появляется. Я проверил, и метод paginate просто возвращает "\n".

3 ответа

Решение

Я не уверен, почему это работает, но Athlon-Krum предложил удалить paginator.render do блок из _paginator.html.erb Kaminari просмотреть файл, изменив его так:

<%= paginator.render do %>
  <%- pagination_class ||= '' %>
  <ul class="pagination <%= pagination_class %>">
    <%= first_page_tag unless current_page.first? %>
    <%= prev_page_tag unless current_page.first? %>
    <% each_page do |page| -%>
      <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
          <%= page_tag page %>
      <% elsif !page.was_truncated? -%>
          <%= gap_tag %>
      <% end -%>
    <% end -%>
    <%= next_page_tag unless current_page.last? %>
    <%= last_page_tag unless current_page.last? %>
  </ul>
<% end %>

к этому:

<%- pagination_class ||= '' %>
<ul class="pagination <%= pagination_class %>">
  <%= paginator.first_page_tag unless current_page.first? %>
  <%= paginator.prev_page_tag unless current_page.first? %>
  <% paginator.each_page do |page| -%>
      <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
          <%= paginator.page_tag page %>
      <% elsif !page.was_truncated? -%>
          <%= paginator.gap_tag %>
      <% end -%>
  <% end -%>
  <%= paginator.next_page_tag unless current_page.last? %>
  <%= paginator.last_page_tag unless current_page.last? %>
</ul>

и это похоже на работу. Не забудьте подготовить paginator. вызовам метода Kaminari, чтобы заставить его работать (примеры выше показывают это изменение, но его легко пропустить).

По моему опыту это была проблема того, что в kaminari#paginate помощник назначает @template как self места, где называется помощник. В обычном представлении Rails @template будет анонимным классом, шаблон представления, который наследуется от ActionView::Base. В клетке @template будет экземпляром самой клетки. kaminari когда рендер использует ActionView::OutputBuffer, Это имеет значение, потому что мнение #render и клетка #render ведет себя по-разному, и клетка #render не кладите ничего в выходной буфер.

Быстрое решение состоит в том, чтобы опустить выходной буфер:

Kaminari::Helpers::Paginator.class_eval do
  def render(&block)
    instance_eval(&block) if @options[:total_pages] > 1
    # @output_buffer
  end
end

Я знаю, что этому вопросу почти 6 лет, но он определенно помог мне наладить совместную игру Kaminari и Cells. В kaminari-cellsgem не работает с Rails 6, поэтому я сделал это, чтобы заставить его работать в моем проекте. По сути, это всего два файла, поэтому я добавил их в свой проект.

      # app/helpers/kaminary/helpers/cells_helper.rb
require 'kaminari/helpers/helper_methods'
require 'cell/partial'

module Kaminari
  module Helpers
    module CellsHelper
      include Kaminari::Helpers::HelperMethods
      include ActionView::Helpers::OutputSafetyHelper
      include ActionView::Helpers::TranslationHelper
      include Cell::ViewModel::Partial

      def paginate(scope, paginator_class: Kaminari::Helpers::Paginator, template: nil, **options)
        options = options.reverse_merge(:views_prefix => "../views/")
        super
      end
    end
  end
end
      # app/models/concerns/kaminary/cells.rb
module Kaminari
  module Cells
    extend ActiveSupport::Concern

    included do
      include Kaminari::Helpers::CellsHelper
    end
  end
end
Другие вопросы по тегам