2015-10-13 80 views
0

有没有办法让结果在will_paginate页面上持续存在?我在bootstrap-datepicker-rails中列出了一个给定范围的报告,其中发布了一个范围的结果,但是当我点击页面2链接时,它会回到没有范围的第2页上的结果。Rails will_paginate persistence

这是我有:

的意见/报告/ 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" %>

控制器/ 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页的问题是不是一个职位。

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

这里的默认页面的外观加载时一样(没有指定范围还):

Default Report Page

那么这里是什么样子时,我定义一系列的像(15年5月1日 - 7/1/15)第1页:

Defined Range

页#2-10工作没有问题:

Pages 2-10

但最后一页总是这样做,仿佛是will_paginate添加额外的页面由于某种原因:

Error on last page

+0

你的过滤提交的'POST'不存在。您可以使过滤器表单在'GET'中提交,并将它们保存在will_paginate链接中。您可以自定义'LinkRenderer'来保存查询参数。 – HungryCoder

+0

有没有这样做的例子吗?它是一个'will_paginate'覆盖,或整个应用程序? – Godzilla74

回答

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 %> 
+0

start_date是较早的日期,end_date是较新的。我喜欢这个建议,因为它可以让它更容易,但是现在在完成你的建议之后,它会在will_paginate行上抛出一个错误“未定义的方法'created_at'for nil:NilClass'。 – Godzilla74

+0

这意味着无论是“@ reports.first”还是“@ reports.last”都是“nil”,这意味着“@ reports”本身是“无”(或空)。这有可能吗? – Jaxx

+0

我刚扩大范围,其中应包括60多个报告,其中15个到一个页面,其他页面上应该有结果。 – Godzilla74

相关问题