2016-06-29 142 views
0

我有一個分頁搜索表單。兩種方式都可以單獨運行,但如果我搜索並加載下一頁,搜索參數將被遺忘,並且kaminari將顯示結果,而不管我選擇了哪些搜索選項。Ruby on rails - Kaminari - 分頁搜索結果

我已閱讀文檔和其他stackoverflow帖子,但我沒有任何運氣。

我的索引頁有

<%= 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 %> 

演出部分:

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

現在,我已經嘗試了一些我的吊環控制器,但我總是得到相同的結果。原本我有;

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 

然後;

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 

然後我試着將它們分開;

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 

但我每次都得到相同的結果。我可以在控制檯上看到,當我加載更多頁面時,搜索參數不包括在內。

我該如何將這兩件事鏈接在一起並正確分頁搜索結果?


UPDATE:後裝 '下頁' 使用@切塔尼亞的回答

服務器日誌。我以前添加了搜索參數。與搜索表單過濾

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日誌時:

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) 

回答

1

試試下面的代碼攜帶您的PARAMS下一頁

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

感謝您的快速回復,我試過了所有的3個版本我的控制器,但我仍然獲得相同的結果。 –

+0

實際上第一個版本應該工作,你可以粘貼日誌,當你進行搜索並點擊分頁 – chaitanya

+0

我已更新我的問題與日誌 –

0

您應該#page#per方法添加到查詢本身。 Kaminari.paginate_array實際上是從整個陣列中分割出來的,效率不高。

這裏有一個片斷

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 

#... 

然後使用Kaminari PAGINATE助手在你看來

<%= paginate @q %> 
+0

感謝您的回覆,但我仍然得到相同的結果 –