2015-10-13 7 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, который я предполагаю, что это проблема, так как нажав на страницу-не пост.

Это не исправлено Всякий раз, когда я нажимаю на последнюю страницу после определения диапазона, она всегда возвращает ошибку, даже если есть еще записи, которые нужно показать.

Вот что страница по умолчанию выглядит при загрузке (без указанного диапазона пока):

Default Report Page

Тогда вот что это выглядит, когда я определить диапазон (5/1/15 - 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

Вы можете передать дополнительные параметры will_paginate с помощью :params вариантов.

В вашем конкретном случае, вы можете сделать следующее:

<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_date или end_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 является более новым. Мне нравится это предложение, так как оно облегчает его работу, однако оно вызывает ошибку 'undefined method' created_at 'для nil: NilClass' на строке will_paginate теперь после того, как вы предложили. – Godzilla74

+0

Это означает, что '@ reports.first' или' @ reports.last' является 'nil', что, в свою очередь, означает, что' @ reports' само является 'nil' (или пустым). Это возможность? – Jaxx

+0

Я просто расширил диапазон, который должен включать более 60 отчетов, с 15 на страницу, на других страницах должны быть результаты. – Godzilla74

Смежные вопросы