⑬「タイトル」「内容」での検索機能を追加

この章でのゴール

・投稿した日記の「タイトル」「内容」で検索をかけれるようにする

「タイトル」「内容」での検索機能を追加

この章では、投稿した日記の「タイトル」「内容」を検索フォームから検索できる機能を実装していきます。

完成イメージは下記です。

Pagesコントローラの設定

まずは、app/controllers/pages_controller.rbを開いて、以下の通り保存します。

class PagesController < ApplicationController
  PER = 5

  def index
    if params[:query].present?
      @posts = Post.where('title LIKE ?', "%#{params[:query]}%")
        .or(Post.where('description LIKE ?', "%#{params[:query]}%"))
        .page(params[:page]).per(PER)
    else
      @posts = Post.where(user: current_user).page(params[:page]).per(PER)
    end
  end
end

 

Post.where('title LIKE ?', "%#{params[:query]}%")
        .or(Post.where('description LIKE ?', "%#{params[:query]}%"))

 

↑この箇所は、あいまい検索と呼びます。

LIKE構文を使い、%で囲むことで、%で囲まれた文字列を含むカラムを検索できます。

また、.orを使うことで、さらに条件を追加できます。

今回は、「タイトル」もしくは「内容」に、検索対象の文字が含まれているか?で検索するため、.orを指定しています。

ルーティングの設定

次に、routes.rbを開いて、以下のコードを追加します。

post '/', to: 'pages#index'

 

検索フォームからの検索文字は、サーバに送られるため、postで定義しています。

検索フォームの追加

app/views/pages/index.html.erbを開いて、以下のように保存します。

<div class="container">
  <div class="row">
    <% if current_user %>
      <div class="col-md-10 col-md-offset-1 text-center">
        <%= form_tag('/', method: :post) do %>
          <%= text_field_tag :query %>
          <%= submit_tag "検索" %>
        <% end %>
        <h3>一覧</h3>
        <table class="table table-bordered">
          <thead>
            <tr>
              <th>No</th>
              <th></th>
              <th>タイトル</th>
              <th>内容</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            <% @posts.each do |post| %>
              <tr>
                <td><%= post.id %></td>
                <td><%= image_tag post.image.url, class: 'thum_image' %></td>
                <td><%= link_to post.title, edit_post_path(post.id) %></td>
                <td><%= post.description %></td>
                <td>
                  <%= link_to '削除', post, class: 'btn btn-danger', method: :delete, data: { confirm: 'この投稿を削除しますか?' } %>
                </td>
              </tr>
            <% end %>
          </tbody>
        </table>

        <%= paginate @posts %>

      </div>
    <% else %>
      <div class="login col-md-4 col-md-offset-4 text-center">
        <h3>TOPページ</h3>
        <p>以下から選択してください。</p>
        <%= link_to 'ログイン', login_path, class: 'btn btn-primary btn-block btn-large' %>
        <%= link_to 'ユーザ登録', new_user_path, class: 'btn btn-default btn-block btn-large' %>
      </div>
    <% end %>
  </div>
</div>

 

<%= form_tag('/', method: :post) do %>
  <%= text_field_tag :query %>
  <%= submit_tag "検索" %>
<% end %>

↑上記で追加したコードです。

form_tagヘルパーで、検索フォームを作成することができます。

実際に、検索フォームから検索してみると、条件に合致したカラムのみが表示されていることが確認できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA