【问题标题】:Rails will_paginate persistenceRails will_paginate 持久化
【发布时间】:2015-10-13 21:36:11
【问题描述】:

有没有办法让结果在will_paginate 页面中持续存在?我正在使用bootstrap-datepicker-rails 列出给定范围内的报告,它会发布一个范围的结果,但是当我单击第 2 页链接时,它会恢复到没有该范围的第 2 页上的结果。

这是我所拥有的:

views/reports/index.html.erb

<%= render partial: "pages/navigation" %>

  <div class="row reports">
      <div class="col-md-2 sidebar no-float">
        <h3 class="text-center">Select Date Range</h3>
        <div class="input-daterange input-group" id="datepicker">
          <%= form_tag reports_index_path, method: :post, :class => "form-inline" do %>
          <div class="form-group">
            <%= label_tag "Start Date:" %>
            <%= text_field_tag(:start_date, @reports.blank? ? '' : params[:start_date], class: "form-control", name: "start_date", data: {"behaviour" => "datepicker"}) %>
            <p class="text-center">to</p>
            <%= label_tag "End Date:" %>
            <%= text_field_tag(:end_date, @reports.blank? ? '' : params[:end_date], class: "form-control", name: "end_date", data: {"behaviour" => "datepicker"}) %>
          </div>
            <br/>
            <br/>
            <%= submit_tag "Update", class: "update-button" %>
          <% end %>
        </div>
      </div>


      <div class="col-md-10 report-list no-float">
        <h2 class="text-center">Reports Archive</h2>
        <% @reports.in_groups_of(3).each do |group| %>
          <ul id="report-list list">
              <% group.each do |report| %>
                <div class="col-md-4">
                  <li class="report">
                    <div class="report-header">
                      <p>
                        <span class="report-data"><%= report.name %></span>
                      </p>
                    </div>
                    <p class="report-text"><%= report.range %></p>
                    <p class="report-text"><%= link_to "Download", report.pdf.url, target: "_blank" %></p>
                  </li>
                </div>
              <% end %>
          </ul>
        <% end %>
      </div>
  </div>
<!-- </div> -->

<div class="pagination-wrapper">
  <%= will_paginate @reports, :previous_label => "Newer", :next_label => "Older", :params => { :start_date => params[:start_date], :end_date => params[:end_date] } %>
</div>


<%= render partial: "pages/footer" %>

controllers/reports_controller.rb

class ReportsController < ApplicationController

  def index
    @company = current_user.company

    @locations = if @company
      current_user.company_locations.order(:name)
    else
      []
    end

    unless @company.nil? || @company.reports.empty?
      if request.post?
        @reports = @company.reports.where(created_at: report_params[:start_date]..report_params[:end_date]).order(created_at: :asc).paginate(page: params[:page], :per_page => 30)
      else
        if params[:start_date].present? && params[:end_date].present?
          @reports = @company.reports.where(created_at: (report_params[:start_date]..report_params[:end_date])).order(created_at: :desc).paginate(page: params[:page], :per_page => 30)
        else
          @reports = @company.reports.order(created_at: :desc).paginate(page: params[:page], :per_page => 30)
        end
      end
    end
  end

  private

    def report_params
      params.permit(:start_date, :end_date)
    end

end

这是固定的所以,默认情况下,如果请求不是 post,我会加载所有可用的报告,我认为这是问题,因为点击第 2 页不是发帖。

这不是固定的每当我在定义范围后单击最后一页时,它总是返回错误,即使仍有记录要显示。

这是加载时默认页面的样子(尚未指定范围):

这就是我在第 1 页上定义 (5/1/15 - 7/1/15) 范围时的样子:

第 2-10 页正常工作:

但是最后一页总是这样,好像 will_paginate 出于某种原因添加了一个额外的页面:

【问题讨论】:

  • 您的过滤以POST 提交,当您单击分页链接时它不存在。您可以在GET 中提交过滤器表单并将其保留在 will_paginate 链接中。您可以自定义LinkRenderer以持久化查询参数。
  • 在任何地方都有这样做的例子吗?是 will_paginate 覆盖,还是整个应用程序?

标签: jquery html ruby-on-rails twitter-bootstrap activerecord


【解决方案1】:

您可以使用 :params 选项将其他参数传递给 will_paginate。

在您的特定情况下,您可以执行以下操作:

<div class="pagination-wrapper">
  <%= will_paginate @reports, :previous_label => "Newest", :next_label => "Oldest", :params => { :start_date => @start_date, :end_date => @end_date } %>
</div>

并像这样修改控制器:

unless @company.nil? || @company.reports.empty?
  if request.post?
    @reports = @company.reports.where(created_at: report_params[:start_date]..report_params[:end_date]).order(created_at: :asc).paginate(page: params[:page], :per_page => 30)
    @start_date, @end_date = @reports.last.created_at, @reports.first.created_at
  else
    if params[:start_date].present? && params[:end_date].present?
      @reports = @company.reports.where(created_at: (params[:start_date]..params[:end_date])).order(created_at: :desc).paginate(page: params[:page], :per_page => 30)
      @start_date, @end_date = params[:start_date], params[:end_date]
    else
      @reports = @company.reports.order(created_at: :desc).paginate(page: params[:page], :per_page => 30)
      @start_date, @end_date = @reports.first.created_at, @reports.last.created_at
    end
  end
end

注意:不确定start_dateend_date 中的哪一个在另一个之前,您可能需要确保正确定义范围,即(最旧的..最近的)

reports 迭代添加了修复:

          <% group.each do |report| %>
            <% unless report.nil? %>
            <div class="col-md-4">
              <li class="report">
                <div class="report-header">
                  <p>
                    <span class="report-data"><%= report.name %></span>
                  </p>
                </div>
                <p class="report-text"><%= report.range %></p>
                <p class="report-text"><%= link_to "Download", report.pdf.url, target: "_blank" %></p>
              </li>
            </div>
            <% end %>
          <% end %>

【讨论】:

  • start_date 是较旧的日期,end_date 是较新的日期。我喜欢这个建议,因为它使它更容易,但是在执行您的建议后,它现在在 will_paginate 行上为 nil:NilClass` 抛出错误 undefined method created_at'。
  • 这意味着@reports.first@reports.lastnil,这又意味着@reports 本身是nil(或为空)。有这种可能吗?
  • 我刚刚扩大了范围,应该包括 60 多个报告,一页有 15 个,其他页面应该有结果。
  • 啊,我想我知道出了什么问题。当@reports 集合更新时,end_datestart_date 将更新为当前段中第一个和最后一个报告的日期。那是行不通的。让我用解决方法编辑代码;)
  • 好的,根据您的建议,我修改了代码,它似乎可以正常工作,但有一个小故障:will_paginate 中的最后一页总是会产生错误。我更新了下面的所有代码并添加了屏幕截图。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多