Question

I am not a ruby on rails programmer but i have gotten quite far with adding a second results table to my page.

the problem that i have is that the Pagination is messed up.

When it is first loaded. everything looks right. but when you click on another page number it changes the page on second table as well. plus adds a copy of the second table as like a 3rd table to the page.

i have screan shots.

Original page loads
Orignial when page loads http://www.digihaul.com/1.png

Once a page is selected

Once a page is selected http://www.digihaul.com/2.png

here is my View

.row-fluid#load_results_table
  .span12
    - if resultss.empty?
      =render partial: 'no_results', locals: {search: search}
    - else
      %h1.page-header Premium Loads
      %p= "These are our loads we are offering. We guarentee 100% payment on these loads"
    %table.table.search_results.table-condensed.table-bordered.table-striped.sortable{:id => "#{searches.search_type.pluralize}"}
      %thead
        %tr.search_header
          %th= sortable_load "origin"
          %th= sortable_load "dest"
          %th= sortable_load "pickup"
          %th= sortable_load "delivery"
          %th= sortable_load "ltl"
          %th= sortable_load "equipment_id", "Equipment"
          %th= sortable_load "weight"
          %th= sortable_load "length"
          %th= sortable_load "rate"
          -unless @searches.origin.blank?
            %th Estimated Deadhead Miles
          %th Actions
      %tbody
        - resultss.each do |result|
          %tr{:class => "#{searches.search_type}_view", :id => "#{result['id']}" }
            %td= Location.to_cs(result.origin)
            %td= Location.to_cs(result.dest)
            %td= format_date(result.pickup)
            %td= format_date(result.delivery)
            %td= full_or_par(result.ltl)
            %td= result.equipment_id ? Equipment.to_equipment_name(result.equipment_id) : ""
            %td= result.weight
            %td= result.length
            %td= result.rate
            -unless @searches.origin.blank?
              %td= Location.distance_between(@searches.origin.coords, result['origin'])
            %td
              .btn-group
                %a.btn.btn-info{ :href => "/#{searches.search_type.pluralize}/#{result['id']}" } Show
                %a.btn{ :href => "javascript:void(0)", :class => "save", user_id: @searches.user_id, :id => result['id']} Save
                %a.btn.btn-primary{ :href => "javascript:void(0)", :class => "cover_link", :user_id=> @searches.user_id } Cover 
    = will_paginate resultss, :renderer => BootstrapPagination::Rails
.row-fluid#load_results_table
  .span12
    - if results.empty?
      =render partial: 'no_results', locals: {search: search}
    - else
      %h1.page-header Search Results
      - if results.count > 1000
        %p= "Your search yielded many #{search.search_type.pluralize}"
      - else
        %p= "Your search yielded #{results.count} #{search.search_type.pluralize}"
      =render partial: 'header_buttons', locals: {search: search}
      %br
      = will_paginate results, :renderer => BootstrapPagination::Rails, id: "first_pagination"
      %table.table.search_results.table-condensed.table-bordered.table-striped.sortable{:id => "#{search.search_type.pluralize}"}
        %thead
          %tr.search_header
            %th= sortable_load "origin"
            %th= sortable_load "dest"
            %th= sortable_load "pickup"
            %th= sortable_load "delivery"
            %th= sortable_load "ltl"
            %th= sortable_load "equipment_id", "Equipment"
            %th= sortable_load "weight"
            %th= sortable_load "length"
            %th= sortable_load "rate"
            -unless @search.origin.blank?
              %th Estimated Deadhead Miles
            %th Actions
        %tbody
          - results.each do |result|
            %tr{:class => "#{search.search_type}_view", :id => "#{result['id']}" }
              %td= Location.to_cs(result.origin)
              %td= Location.to_cs(result.dest)
              %td= format_date(result.pickup)
              %td= format_date(result.delivery)
              %td= full_or_par(result.ltl)
              %td= result.equipment_id ? Equipment.to_equipment_name(result.equipment_id) : ""
              %td= result.weight
              %td= result.length
              %td= result.rate
              -unless @search.origin.blank?
                %td= Location.distance_between(@search.origin.coords, result['origin'])
              %td
                .btn-group
                  %a.btn.btn-info{ :href => "/#{search.search_type.pluralize}/#{result['id']}" } Show
                  %a.btn{ :href => "javascript:void(0)", :class => "save", user_id: @search.user_id, :id => result['id']} Save
                  %a.btn.btn-primary{ :href => "javascript:void(0)", :class => "cover_link", :user_id=> @search.user_id } Cover 
      = will_paginate results, :renderer => BootstrapPagination::Rails

Controller:

  def show
    @search = Search.find(params[:id])
    @searches = Search.find(params[:id])
    @results = @search.search(params[:page])
    @resultss = @searches.searches(params[:page])
    @search.update_attribute(:results, @results.count)
    @searches.update_attribute(:resultss, @resultss.count)
    respond_to do |format|
      format.html 
      format.js {render "results"}
      format.js {render "resultss"}
    end
  end

Model (minimized the query)

  def search(page)
    where = []
    where << PrepareSearch.states("dest", self.dest_states) unless self.dest_states.blank?
    if self.search_type == 'load'
      select = "loads.id, origin, dest, pickup, delivery, ltl, equipment_id, weight, length, rate"
      where << PrepareSearch.date('pickup', self.pickup, self.pickup_operator) unless self.pickup.blank?
    elsif self.search_type == 'truck'
      select = "trucks.id, origin, dest, available, expiration, equipment_id, comments"
      where << PrepareSearch.date('available',self.available,self.available_operator) unless self.available.blank?
    end
    where = where.join(' AND ')
    order = self.order_by ? self.order_by + " desc" : ""
    limit = "LIMIT=200"
      Module.const_get(self.search_type.capitalize).where(where).select(select).limit(limit).order(order).page(page).per_page(20)
  end


  def searches(page)
    where = []
    where << PrepareSearch.states("dest", self.dest_states) unless self.dest_states.blank?
    if self.search_type == 'load'
      select = "loads.id, origin, dest, pickup, delivery, ltl, equipment_id, weight, length, rate"
      where << PrepareSearch.date('pickup', self.pickup, self.pickup_operator) unless self.pickup.blank?
    elsif self.search_type == 'truck'
      select = "trucks.id, origin, dest, available, expiration, equipment_id, comments"
      where << PrepareSearch.date('available',self.available,self.available_operator) unless self.available.blank?
    end
    where = where.join(' AND ')
    order = self.order_by ? self.order_by + " desc" : ""
    limit = "LIMIT=200"
      Hotload.where(where).select(select).limit(limit).order(order).page(page).per_page(5)
  end
Was it helpful?

Solution

Ajax pagination is one way, as described in the comments, but the best way to handle it will be to change the page param for each pagination block


param_name

You can do this with Kaminari (I know you're using will_paginate) using the param_name argument. This basically sets the param each pagination block reads, allowing you to call them differenetly, thus controlling different sets of data:

<%= paginate collection, param_name: model.to_s %>

Having researched how to do this with will_paginate, it seems you're able to use the param_name argument too:

<%= will_paginate @products, param_name: 'products_page' %>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top