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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

1568閲覧

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

lyzmfeqpxs54

総合スコア237

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/10/14 07:05

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

タイトル通りなのですが、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 %>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

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

投稿2020/10/15 04:59

lyzmfeqpxs54

総合スコア237

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 07:17

編集2020/10/14 08:04
necocoa

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyzmfeqpxs54

2020/10/14 07:42

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

2020/10/14 08:05

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

2020/10/15 04:45

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

2020/10/15 05:00

necocoa様、度々のご回答ありがとうございました。 link_to_next_page の引数に、params: params.permit!を渡してあげることで解決できました。 ご迷惑おかけして申し訳ありません。 また何かありました際に、ご教示いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問