💡
[Rails]検索機能の実装方法(gemなし)
Railsで検索機能を実装
< 実装方法はふたつ >
A. gemを使わずに実装。(検索フォームを作り込む)
B. gem/Ransackを使用して実装。(機能を外部から取り込む)
今回は gemを使わずに実装を書いていきたいと思います。
今回作るもの
イラストにするとこんな感じ
実装する機能
- コントローラ : searches
searchアクション追加 用途:検索を行う- ビュー
検索結果表示画面を作成
検索対象(ユーザーか投稿か)の選択かをプルダウンメニューで選択
A. gemを使わずに実装する方法
制作手順
- コントローラーの作成
- routingの記述
- viewの作成
- コントローラー内のアクションの定義
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