【问题标题】:How do I paginate a hash of arrays using the Kaminari (or will_paginate) gem如何使用 Kaminari(或 will_paginate)gem 对数组散列进行分页
【发布时间】:2012-07-18 02:06:10
【问题描述】:

我现在已经设法找到解决方法。现在,索引操作在调用页面之前有一个“订单”子句,然后按日期对餐食进行排序和分组。接下来是 hackey 位:视图中使用 @total_pages 和 @pages 提供分页链接,因为内置帮助器不适用于 @meals 返回的数组哈希。它有效(有点)但它是hackey。将视图内容移动到帮助程序中肯定会有助于清理它,这是我的下一步。

def index
  @meals = Meal.order('date DESC').page(params[:page]).text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date)
  @total_pages = (Meal.all.size / 7.to_f).ceil
  @pages = (1..@total_pages).to_a 
respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @meals }
end

结束

我真的需要这方面的帮助 - 这让我发疯了好几天。我正在尝试对数组的哈希进行分页。我已经尝试过 will_paginate 和 Kaminari,但找不到对生成的哈希进行分页的方法。

我正在运行 Rails 3.2.6、Ruby 1.9.3 和 PostgreSQL 9.1.3 正在搜索...

在我的控制器(并使用 Kaminari)中,我有:

def index
  @meals = Meal.text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date).page(params[:page])
respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @meals }
  end
end

在我的模型中,我有以下搜索:

def self.text_search(query)
  if query.present?
    where("description @@ :q or meal_time @@ :q", q: query)
  else
    scoped
  end
end 

在我的视图模板中:

<div class="container">
  <div class="row">
<%= form_tag meals_path, method: :get, :class => "well form-search" do %>
  <%= text_field_tag :query, params[:query], 
                     :class => "span3" %>
  <%= submit_tag "Search", name: nil, :class => "btn" %>
    <% if current_user %>
      <p class="pull-right"> 
    <%= link_to "Add a meal",
                new_meal_path,
                :class => 'btn btn-success' %>
    </p>
    <% else %>
    <% end %>
<% end %>       
</div>
<table class="table table-striped">
<tbody>
  <% @meals.each do |date, meals| %>
  <tr> 
    <td>
      <h2><%= date.to_s(:day_of_month) %></h2>
      <h6><%= date.to_s(:date_and_month) %></h6>
      <p><span class="badge badge-warning"><%= pluralize(meals.size, "meal") %></span></p>
    </td>
    <% meals.each do |meal| %>
      <td>
        <p>
          <strong>
            <%= meal.consumed_at.to_s(:just_the_time)%> 
            <%= meal.meal_time %> &#8212; 
            <%= meal.description %>
          </strong>
        </p>
        <%= link_to "Ingredients", meal_path(meal) %>
      </td>
      <% end %>
    </tr>
  <% end %>
</tbody>
</table> 
</div>
<%= paginate @meals %>  

这会返回以下错误:

NoMethodError in MealsController#index

undefined method `page' for Hash

任何帮助将不胜感激!

【问题讨论】:

  • 我对Ruby一无所知,但是你不是通常在搜索功能中分页,而不是事后吗?我的意思是这样你会得到所有的结果,然后在哈希中分页!在 text_search 部分……不应该有“skip”和“limit”命令吗?
  • @sinni800 - 感谢您的帮助。我已经设法找到了解决这个问题的(有点破解)方法!
  • 你能把工作贴出来吗??
  • @stevanity 道歉 - 我应该早点发帖,但我的 hack(我认为有效)实际上并没有奏效。不妨试试 Space Monkey 发布的解决方案。

标签: ruby-on-rails will-paginate kaminari


【解决方案1】:
Kaminari.paginate_array(ARRAY_OBJECT).page(params[:page]).per(50)

【讨论】:

    【解决方案2】:

    这是我在研究了一段时间后是否必须使用 will_paginate 后的解决方案(Kaminari 更灵活且更易于使用)

      current_page = params[:page] || 1
      per_page = params[:per_page] || 20
      length = @data.length
    
      @data = WillPaginate::Collection.create(current_page, per_page, length) do |pager|
        pager.replace @data[pager.offset, pager.per_page].to_a
      end
    

    运行这些代码后,@data 将与带有 will_paginate 分页的 ActiveRecord 对象相同:

    • @data 是一个哈希数组

    • 是在视图中显示分页菜单的代码

    希望这能帮助其他有同样问题的人。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2012-10-22
      • 2015-10-01
      • 2011-10-31
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多