Kaminari::Cells 分页方法不渲染任何东西

Kaminari::Cells paginate method not rendering anything

我正在使用 Kaminari::Cells gem,当我在单元格视图中使用分页方法时,没有任何显示。我查了一下,paginate 方法只返回“\n”。

我不确定它为什么有效,但 athlon-krum 建议删除 _paginator.html.erb Kaminari 视图文件的 paginator.render do 块,将其更改为:

<%= 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>

这似乎行得通。不要忘记在 Kaminari 方法调用前添加 paginator. 以使其工作(上面的示例显示了此更改,但很容易错过)。

根据我的经验,问题在于 kaminari #paginate 助手将 @template 分配为调用助手的地方的 self。通常 Rails 视图 @template 将是一个匿名的 class,继承自 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-cells gem 不适用于 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