💡

[Rails]検索機能の実装方法(gemなし)

2023/01/31に公開

Railsで検索機能を実装

< 実装方法はふたつ >
A. gemを使わずに実装。(検索フォームを作り込む)
B. gem/Ransackを使用して実装。(機能を外部から取り込む)

今回は gemを使わずに実装を書いていきたいと思います。

今回作るもの

イラストにするとこんな感じ

実装する機能

  • コントローラ : searches
    searchアクション追加 用途:検索を行う
  • ビュー
    検索結果表示画面を作成
    検索対象(ユーザーか投稿か)の選択かをプルダウンメニューで選択

A. gemを使わずに実装する方法

制作手順

  1. コントローラーの作成
  2. routingの記述
  3. viewの作成
  4. コントローラー内のアクションの定義

1.コントローラーの作成

今回は、searchesコントローラーを作成する。 $ rails g controller searches

2. routingの記述

上記したように、今回は以下のようにコントローラーを作成するので…

searchesコントローラ追加
searchアクション追加 ⇒ 用途:検索を行う (検索 = get)

:
get 'serches/search', to: 'serches#search'
:

3. viewの作成

全てのページで、ヘッダーの下に作成していくので,application.html.erbに記述していきます。
(私はpartialでformを作り、作成していきます。)

①form用のpartialのerbを作成、記述


< _seach.html.erb >

<div class="serch_form">
    <%= form_with url: searches_search_path,method: :get, local: true do |f| %>
    <%= f.text_field :content %>
    <%= f.select :model,options_for_select({"User"=>"user","Book"=>"book"})%>
    <%= f.select :method,options_for_select({"完全一致"=>"perfect","前方一致"=>"forward",
        "後方一致"=>"backward","部分一致"=>"partial"})%>
    <%= f.submit'検索' %>
    <% end %>
</div>

補足:HTMLだとこうなる!(復習)

<select name="form">
	<option value=””>User</option>
	<option value=””>Book</option>
</select>	

4. コントローラー内のアクションの定義

view内で使用する変数を定義する。

<searches controller>

class SearchesController < ApplicationController
  before_action :authenticate_user!

	def search
	      @model=params[:model]
	      @content=params[:content]
	      @method=params[:method]
	      if @model == 'user'
		@records=User.search_for(@content,@method)
	      else
		@records=Book.search_for(@content,@method)
	      end
	    end
end
  • @modelの値がuserだった場合と、bookだった場合で条件分岐し、
    @recordsに検索結果を入れている。

モデルファイルにも、検索条件の分岐を書く

<user.rb>

:
def self.search_for(content, method)
    if method == 'perfect'
      User.where(name: content)
    elsif method == 'forward'
      User.where('name LIKE ?', content + '%')
    elsif method == 'backward'
      User.where('name LIKE ?', '%' + content)
    else
      User.where('name LIKE ?', '%' + content + '%')
    end
  end	
:	

文字検索をしたい時はLIKE句を使用する。
[ここのページがわかりやすいです]https://qiita.com/seri1234/items/765423c2c46ca4114da0

<book.rb>

:
 def self.search_for(content, method)
    if method == 'perfect'
      Book.where(title: content)
    elsif method == 'forward'
      Book.where('title LIKE ?', content+'%')
    elsif method == 'backward'
      Book.where('title LIKE ?', '%'+content)
    else
      Book.where('title LIKE ?', '%'+content+'%')
    end
  end
:

5. 検索後の表示View作成

今回はpartialを使用しているのでこのように記述

<% if @model == 'user' %>
    <h3>Users search for "<%= @content %>"</h3>
  <%= render 'users/index', users: @records %>
<% elsif @model == 'book' %>
    <h3>Books search for "<%= @content %>"</h3>
  <%= render 'books/index', books: @records %>
<% end %>
  • if文で Userだった場合と bookだった場合で定義。

Discussion