文系エンジニア大学生の技術ブログ

主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。

【rails5.2】検索フォームを作成してみたよ。キーワードと部分一致した結果を表示させる

<

f:id:daikiyano:20190206160323p:plain

今回、rails5.2で検索フォームを実装する方法をご紹介します。

検索機能の実装

今回、ユーザー一覧が表示されるusers/indexページに、検索フォームを実装します。 検索フォームに入力されたキーワードがデーターベースにあるユーザー名と部分一致した場合、そのユーザー名を表示される仕様にします。

まずは、以下のように検索フォームを作成します。 ユーザーネームのカラム名はusernameです。

users/index.html.erb

     #検索拡張機能
          <%= form_tag(users_path, :method => "get") do %>
            <%= text_field_tag :search %>
            <%= submit_tag "Search" ,:username => nil ,class: "button is-info"%>
          <% end %>

 
     <% @users.each do |user| %>
      

続いてUsersControllerのindexにsearch(params[:search])を追加します。 検索フォームで入力されたキーワードがparamsの中に入るようなイメージです。

  • search(検索フォームで入力されたキーワード)

class UsersController < ApplicationController
(中略)
  def index
      @users = User.paginate(page: params[:page], per_page: 5).search(params[:search])
  end
(中略)
end

最後にuserモデルにsearchというメソッドを作成します。 検索フォームで入力されたキーワードがsearchメソッドの中で処理されます。 キーワードと部分一致するユーザーネームがあれば、その結果がページに表示されます。 部分一致するユーザーネームがない場合は、allとして全てのユーザーネームが一覧として表示されるようになります。

models/user.rb

class User < ApplicationRecord

  def self.search(search) #self.はUser.を意味する
    if search
      where(['username LIKE ?', "%#{search}%"]) #検索とuseanameの部分一致を表示。
    else
      all #全て表示させる
    end
  end


end

完成イメージとして下のようになります。

f:id:daikiyano:20190206160121p:plain

f:id:daikiyano:20190206165520p:plain

参考サイト

qiita.com

www.for-engineer.life

www.for-engineer.life

www.for-engineer.life

www.for-engineer.life