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
我正在使用 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