2016-06-29 17 views
0

Ich habe ein Suchformular mit Seitenumbruch. Beide Dinge funktionieren einzeln OK, aber wenn ich die nächste Seite suche und dann lade, werden die Suchparameter vergessen und Kaminari zeigt Ergebnisse an, unabhängig davon, welche Suchoptionen ich ausgewählt habe.Rubin auf Schienen - Kaminari - Paginate Reihe von Suchergebnissen

Ich habe die Dokumente und andere Stackoverflow-Beiträge gelesen, aber ich habe kein Glück.

Meine Index-Seite hat

<%= search_form_for @q, html: { id: "gig_search_form" }, remote: true do |f| %> 
bla bla bla... 
<% end %> 
<%= link_to_next_page @gigs, 'Next Page', :remote => true %> 

index.js.erb

<% if params[:page] %> 
$('.gig-search-list').append("<%= j render(partial: 'gigs') %>"); 
<% else %> 
$('.gig-search-list').html("<%= j render(partial: 'gigs') %>"); 
<% end %> 

konzerte Teil:

<% @gigs.each do |gig| %> 
     bla bla bla... 
    <% end %> 

Nun habe ich versucht, ein paar tönt in meinen Controller, aber ich bekomme immer die gleichen Ergebnisse. Ursprünglich hatte ich;

def index 
     if params[:search].present? 
     @q = Gig.notexpired.where(:filled => false).near(params[:search], 500, :order => 'distance').ransack(params[:q]) 
     else 
     @q = Gig.notexpired.where(:filled => false).ransack(params[:q]) 
     end 
     @allgigs = @q.result(distinct: true) 
     @gigs = @q.result(distinct: true).page(params[:page]).per(5) 
     respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

Dann;

def index 
     if params[:search].present? 
     @q = Gig.notexpired.where(:filled => false).near(params[:search], 500, :order => 'distance').ransack(params[:q]) 
     else 
     @q = Gig.notexpired.where(:filled => false).ransack(params[:q]) 
     end 
     @allgigs = @q.result(distinct: true) 
     @gigs = Kaminari.paginate_array(@allgigs).page(params[:page]).per(5) 
     respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

Dann habe ich versucht, sie zu trennen;

def index 
     if params[:search].present? 
     @q = Gig.notexpired.where(:filled => false).near(params[:search], 500, :order => 'distance').ransack(params[:q]) 
     else 
     @q = Gig.notexpired.where(:filled => false).ransack(params[:q]) 
     end 
     @allgigs = @q.result(distinct: true) 
     if @allgigs.present? 
     unless @allgigs.kind_of?(Array) 
      @gigs = @allgigs.page(params[:page]).per(5) 
     else 
      @gigs = Kaminari.paginate_array(@allgigs).page(params[:page]).per(5) 
     end 
     end 
     respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

Aber ich bekomme jedes Mal das gleiche Ergebnis. Ich kann auf der Konsole sehen, dass beim Laden von mehr Seiten die Suchparameter nicht enthalten sind.

Wie kann ich die beiden Dinge miteinander verknüpfen und die Suchergebnisse korrekt paginieren?


UPDATE:

Server-Protokoll nach 'nächste Seite' Laden mit Antwort des @ chaitanya. Ich habe zuvor Suchparameter hinzugefügt.

Started GET "/gigs?locale=en&page=2" for 127.0.0.1 at 2016-06-29 14:45:53 +0200 
Processing by GigsController#index as JS 
    Parameters: {"locale"=>"en", "page"=>"2"} 
    Gig Load (10.3ms) SELECT DISTINCT "gigs".* FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:53.493341') AND "gigs"."filled" = $1 [["filled", "f"]] 
    Gig Load (1.2ms) SELECT DISTINCT "gigs".* FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:53.493341') AND "gigs"."filled" = $1 LIMIT 5 OFFSET 5 [["filled", "f"]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 7]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 2]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 6]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 8]] 
    Rendered gigs/_gigs.html.erb (13.4ms) 
    (0.5ms) SELECT DISTINCT COUNT(DISTINCT "gigs"."id") FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:53.493341') AND "gigs"."filled" = $1 [["filled", "f"]] 
    Rendered gigs/index.js.erb (17.2ms) 
Completed 200 OK in 54ms (Views: 21.4ms | ActiveRecord: 13.0ms) 

Server-Protokoll, wenn eine Filterung mit Suchformular:

Started GET "/gigs?locale=en&utf8=%E2%9C%93&search=&q%5Bdate_gteq%5D=&q%5Bdate_lteq%5D=&q%5Bgenres_id_in%5D%5B%5D=&q%5Bsalary_cents_gteq_euros%5D=0.00&q%5Bsalary_cents_lteq_euros%5D=210.00" for 127.0.0.1 at 2016-06-29 14:45:47 +0200 
Processing by GigsController#index as JS 
    Parameters: {"locale"=>"en", "utf8"=>"✓", "search"=>"", "q"=>{"date_gteq"=>"", "date_lteq"=>"", "genres_id_in"=>[""], "salary_cents_gteq_euros"=>"0.00", "salary_cents_lteq_euros"=>"210.00"}} 
    Gig Load (0.6ms) SELECT DISTINCT "gigs".* FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:47.973892') AND "gigs"."filled" = $1 AND ("gigs"."salary_cents" >= 0 AND "gigs"."salary_cents" <= 21000) [["filled", "f"]] 
    Gig Load (0.5ms) SELECT DISTINCT "gigs".* FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:47.973892') AND "gigs"."filled" = $1 AND ("gigs"."salary_cents" >= 0 AND "gigs"."salary_cents" <= 21000) LIMIT 5 OFFSET 0 [["filled", "f"]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 8]] 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 7]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 3]] 
    Rendered gigs/_gigs.html.erb (12.2ms) 
    (0.4ms) SELECT DISTINCT COUNT(DISTINCT "gigs"."id") FROM "gigs" WHERE (gigzonetime > '2016-06-29 12:45:47.973892') AND "gigs"."filled" = $1 AND ("gigs"."salary_cents" >= 0 AND "gigs"."salary_cents" <= 21000) [["filled", "f"]] 
    Rendered gigs/index.js.erb (15.6ms) 
Completed 200 OK in 33ms (Views: 19.9ms | ActiveRecord: 5.7ms) 

Antwort

1

try folgenden Code Ihre params zur nächsten Seite tragen

= link_to_next_page @gigs, "Next Page", :remote => true, :params => params 
+0

Vielen Dank für Ihre schnelle Antwort, habe ich versucht, dass bei allen drei Versionen meiner Controller, aber ich bin immer noch das gleiche Ergebnis erhalten. –

+0

eigentlich erste Version sollte funktionieren, können Sie Protokoll einfügen, wenn Sie suchen und klicken Sie auf Paginierung – chaitanya

+0

Ich habe meine Frage mit den Protokollen –

0

Sie sollen die #page und #per Methoden zur Abfrage hinzufügen selbst. Kaminari.paginate_array nimmt tatsächlich eine Scheibe aus dem gesamten Array, die nicht sehr effizient ist.

Hier ist ein Ausschnitt

def index 
    if params[:search].present? 
    @q = Gig.notexpired.where(:filled => false).page(params[:page]).per(5).near(params[:search], 500, :order => 'distance').ransack(params[:q]).results 
    else 
    @q = Gig.notexpired.where(:filled => false).page(params[:page]).per(5).ransack(params[:q]).results 
    end 

#... 

dann die Kaminari Paginieren Helfer in Ihrer Ansicht verwenden

<%= paginate @q %> 
+0

Danke für Ihre Antwort, aber ich bekomme immer noch die gleichen Ergebnisse –