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

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

ただいまの
回答率

90.51%

  • Ruby on Rails 4

    2436questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

kaminariでページネーションを実装すると検索機能が動作しなくなる

解決済

回答 1

投稿 編集

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

koichi8888

score 11

 前提・実現したいこと

データ一覧画面に検索機能を実装後、kaminariを利用してページネーションを実装しました。
その後、検索機能で検索ワードを入力し、検索しても、表示はすべてのデータが表示され、検索結果でソートされたデータのみの表示がされなくなりました。
ページネーションの実装の記載をコメントアウトすると正常動作します。
原因としてはページネーションの機能がDBのすべてのデータを対象としていることが原因で、正しくは検索条件にマッチするデータのみをページネーションの対象とする必要があると思うのですが、実装方法のサンプルが見つからずに困っています。
そのため、実装例をご教示頂けると大変助かります。

 該当のソースコード

index.html.erb

<main>
<!-- ↓↓ログインメッセージ、データ登録、編集成功表示↓↓ -->

        <% if flash[:notice] %>
          <div class="alert alert-success">
            <%= flash[:notice] %>
            </div>
        <% end %>

<!-- ↑↑ログインメッセージ、データ登録、編集成功表示↑↑ -->


<br>
<br>
<br>
<p class="rei1">通知</p>
<br>
<br>

<% @items_1month.each do |item| %>
  <ul>
    <li>
      管理ID <%= item.manage_id %> は期限切れまであとXX日です。有効期限の終了日は <%= item.end_date %> です。
    </li>
  </ul>
<% end %>


<br>
<p class="rei1">データ検索</p>

<div> 
<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:manage_id, '管理ID') %>
  <%= text_field_tag(:manage_id) %>
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:category_id, 'カテゴリ') %>
  <%= text_field_tag(:category_id) %>
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:publish_corporation, '発行会社') %>
  <%= text_field_tag(:publish_corporation) %>
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:ip_address, 'IPアドレス') %>
  <%= text_field_tag(:ip_address) %>  
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:target_server, '対象サーバ') %>
  <%= text_field_tag(:target_server) %>  
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:start_date, '有効期限の開始日') %>
  <%= text_field_tag(:start_date) %>  
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:end_date, '有効期限の終了日') %>
  <%= text_field_tag(:end_date) %>  
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>

<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:comment, 'コメント') %>
  <%= text_field_tag(:comment) %>
  <%= submit_tag('検索') %> <%= link_to 'クリア', items_path %>
<% end %>
</div>

<br>
<p class="rei1">データ一覧</p>
<br>

<!-- 権限によってデータ一覧の項目値を変更 -->

<section>

<!-- 追加箇所開始 -->
<% if false %>
<%= page_entries_info @items %>
<% end %>
<!-- 追加箇所終了 -->


  <table class="type06">
    <thead>

      <% if session[:authority] == "1" %>

     <tr>
      <th>管理ID</th>
      <th>カテゴリ</th>
      <th>発行会社</th>
      <th>IPアドレス</th>
      <th>対象サーバ</th>
      <th>有効期限の開始日</th>
      <th>有効期限の終了日</th>
      <th>コメント</th>
      <th>操作</th>
     </tr>

  </thead>
  <tbody>

    <% @items.each do |item| %>
     <tr>
      <td><%= item.manage_id %></td>
      <td><%= item.category_id %></td>
      <td><%= item.publish_corporation %></td>
      <td><%= item.ip_address %></td>
      <td><%= item.target_server %></td>
      <td><%= item.start_date %></td>
      <td><%= item.end_date %></td>
      <td><%= item.comment %></td>
      <td>
      <%= link_to '[Edit]', edit_item_path(item), class: 'command' %>
      <%= link_to '[Delete]', 
      item_path(item), 
      method: :delete,
      class: 'command',
      data: { confirm: 'データ削除しますか?' } %>
      </td>
     </tr>

    <% end %>


    <% elsif session[:authority] == "2" %>

     <tr>
      <th>管理ID</th>
      <th>カテゴリ</th>
      <th>発行会社</th>
      <th>IPアドレス</th>
      <th>対象サーバ</th>
      <th>有効期限の開始日</th>
      <th>有効期限の終了日</th>
      <th>コメント</th>
     </tr>

      <% @items.each do |item| %>
     <tr>
      <td><%= item.manage_id %></td>
      <td><%= item.category_id %></td>
      <td><%= item.publish_corporation %></td>
      <td><%= item.ip_address %></td>
      <td><%= item.target_server %></td>
      <td><%= item.start_date %></td>
      <td><%= item.end_date %></td>
      <td><%= item.comment %></td>
     </tr>

    <% end %>

    <% else %>

      <!-- データ一覧を表示しない -->

    <% end %>

    </tbody>
  </table>


<!-- 追加箇所開始 -->

<%= paginate @items %>

<!-- 追加箇所終了 -->

</section>

<br>
<%= link_to "CSV出力", items_path(format: :csv), class: "btn btn-primary" %>

</main>


items_controller.rb

class ItemsController < ApplicationController

 before_action :authenticate_user


  def index

    # データを降順で表示する
    #  @items = GyomuDatum.all.order(created_at: 'desc')

    # データ検索

      if params[:manage_id]
        @items = GyomuDatum.where('manage_id LIKE ?', "%#{params[:manage_id]}%")
      elsif params[:category_id]
        @items = GyomuDatum.where('category_id LIKE ?', "%#{params[:category_id]}%")
      elsif params[:publish_corporation]
        @items = GyomuDatum.where('publish_corporation LIKE ?', "%#{params[:publish_corporation]}%")
      elsif params[:ip_address]
        @items = GyomuDatum.where('ip_address LIKE ?', "%#{params[:ip_address]}%")
      elsif params[:target_server]
        @items = GyomuDatum.where('target_server LIKE ?', "%#{params[:target_server]}%")
      elsif params[:start_date]
        @items = GyomuDatum.where('start_date LIKE ?', "%#{params[:start_date]}%")
      elsif params[:end_date]
        @items = GyomuDatum.where('end_date LIKE ?', "%#{params[:end_date]}%")
      elsif params[:comment]
        @items = GyomuDatum.where('comment LIKE ?', "%#{params[:comment]}%")
      else
        @items = GyomuDatum.all.order(created_at: 'desc')
      end



    # ページネーション
     @items = GyomuDatum.page(params[:page]).per(20)

    # 期限が迫っているデータを検索する

    # 1ヶ月前
     from  = Time.now.at_beginning_of_day
     to    = (from + 1.month)
     @items_1month = GyomuDatum.where(end_date: from...to)

  end
end

 補足情報(FW/ツールのバージョンなど)

・Phusion Passenger
Phusion Passenger 5.2.3

・Apache
Server version: Apache/2.4.6 (CentOS)

・Rails
Rails 4.2.10

・OSバージョン
CentOS Linux release 7.4.1708 (Core)

・Mysql
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper

・Git
git version 1.8.3.1

・Ruby
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • gouf

    2018/06/04 19:12

    「@items = GyomuDatum.page(params[:page]).per(20)」を「@items = @items.page(params[:page]).per(20)」に換えた場合に何か変化は見られますか?

    キャンセル

  • koichi8888

    2018/06/06 13:20

    ご返信が遅れ、申し訳ありません。記載を上記に変更したところ動作するようになりました。検索結果のデータを格納する変数をページネーションの対象とする記載ができていなかったようです。ご回答ありがとうございました。

    キャンセル

回答 1

check解決した方法

0

質問への追記・修正の依頼に追記している内容になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Ruby on Rails 4

    2436questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。