質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

モデルの検索結果をkaminariでもっと見る機能で表示した際に、検索結果ではなく全体が表示される

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 439

score 214

いつもお世話になっております。

タイトル通りなのですが、controller側でモデルの検索結果をクエリパラメータの条件により絞り込み、view側にモデルを渡しそれを表示しています。
表示はページングgemであるkaminariを使用しており、「もっと見る」を押すと5件ずつ表示されていきます。
ごちゃごちゃと処理をしてしまっていますが、最終的に@itemsはActiveRecord形式であり、実際に表示させたいデータとなります。

モデル全体が30行あり、コントローラーで10件に絞り込んだ場合、最初の表示で5件、「もっと見る」を押すと絞り込んだ残りの5件が表示されることを想定しているのですが、現状のままだともっと見るを押した際に、全体の30件のデータから2ページ目の5つ分のレコードを取ってきてしまいます。

javascript内でpryで止めてみると、「もっと見る」が押された場合にクエリパラメータにはpage=2の情報しか渡されていませんでした。

kaminariの自動生リンクである↓
<%= link_to_next_page @items, 'もっと見る', remote: true, id: 'more_link' %>

に、検索などのパラメータを渡すにはどのようにすればよいのでしょうか。

参考になるサイトでも構いませんので、適切な方法をご教示いただけますと幸いです。
よろしくお願いいたします。

環境
Amazon Linux release 2 (Karoo)
Rails 5.2.3
Ruby version: 2.6.1

# xxxx.controller.rb
def show
    @items_tmp = []
    if !params[:jouken1].nil?
      # 絞り込み処理 User.where(xxx: yyyy) など

    end

    if !params[:jouken2].nil?
      # 絞り込み処理 User.where(xxx: yyyy) など

    end

  ・
  ・
  ・

    # 配列をActivereecordに戻す
    @items = @items_tmp .first.class.where(id: arr.map(&:id)).page(params[:page]).per(5).order(created_at: "DESC")

   render "xxxxx/show"

end



# show.html.erb
<%= render 'items' %>
<%= link_to_next_page @items, 'もっと見る', remote: true, id: 'more_link' %>



# _items.html.erb
<% @items.each do |item| %>
  <% item.id %>
  <% item.name %>
  ・
 ・
 ・
<% end %>



# show.js.erb
$('#items').append("<%= escape_javascript(render 'items', object: @items) %>");
$("#more_link").replaceWith("<%= escape_javascript(link_to_next_page(@items, 'もっと見る', remote: true, id: 'more_link')) %>");
<%# binding.pry %>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

view内のもっと見るを作成するメソッド「link_to_next_page」の引数に以下のような形でパラメータを付与することで、解決いたしました。

show.html.erb
<%= link_to_next_page @items, 'もっと見る', remote: true, id: 'more_link', params: params.permit! %>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

私でしたら、

  1. 10件すべて取得する
  2. view側で6件目以降はCSSで非表示にする
  3. CSS or JavaScriptで「もっと見る」を押したら、6件目以降を表示する
    で実装しますかね

■追記
「もっと見る」のAjaxの実装は済んでいましたね。見落としていました。
現状だとAjaxで取得してもrenderが実行されてしまっているので新しい5件のみ表示されるようになっています。
Ajaxの時はrenderしないようにする必要があります。

format.jsなどを使ってAjaxの時はjsファイルを実行するように変更してみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/14 16:42

    ご回答ありがとうございます。

    現在は実験の段階で、30件程度としていますが、実際の件数は1000件以上を想定しており、仕様上、ページネーションではなく「もっと見る」での実装で進めたいと考えています。

    キャンセル

  • 2020/10/14 17:05

    もっと見るの実装は済んでいましたね、気づいていませんでした。
    追記したのでご確認ください!

    キャンセル

  • 2020/10/15 13:45

    度々のご回答ありがとうございます。
    format.jsでというのはコントローラーのshow内で以下のような処理をするイメージでしょうか。
    「もっと見る」が押された場合の動きは、コントローラー→jsファイルの流れだと思っており、以下のような形にした場合でも、現状showの一番上でpryで止めた段階で検索パラメータが来ていないので検索で絞った内容の続きの表示ができないような気がしてしまいます。
    こちらの勘違いでしたら申し訳ございません。

    respond_to do |format|
    format.html do
    render 'xxxx/show'
    end
    format.js do

    end
    end

    キャンセル

  • 2020/10/15 14:00

    necocoa様、度々のご回答ありがとうございました。

    link_to_next_page の引数に、params: params.permit!を渡してあげることで解決できました。
    ご迷惑おかけして申し訳ありません。

    また何かありました際に、ご教示いただけますと幸いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • モデルの検索結果をkaminariでもっと見る機能で表示した際に、検索結果ではなく全体が表示される