🔍

【Rails】簡易的な検索機能

2023/10/14に公開

実装機能

  • コントローラー
  • ビュー
  • モデル
  • ルーティング

コントローラー

  • searchesコントローラ追加
rails g controller searches
  • searchアクション追加
searches_controller.rb
class SearchesController < ApplicationController
  before_action :authenticate_end_user!

  def search
    @search_results = Facility.where("column_name LIKE ?", "%#{params[:search]}%")
  end
end

※ column_name は自身で作成したもので検索したいカラム名を入れる。

ビュー

  • 検索結果表示画面を作成し、検索結果を表示すること
  • 今回は部分一致

検索フォームの作成+α

_form.html.erb
<%= form_tag(search_path, method: :get) do %>
  <div class="form-group">
    <%= text_field_tag :search, params[:search], placeholder: "検索キーワード" %>
    <%= submit_tag "検索", class: "btn btn-primary" %>
  </div>
<% end %>

部分テンプレートで作っているため、検索窓をおきたいページにrenderで記述する

<div>
  <%= render "searches/form" %>
</div>

検索結果を表示するビューを作成

search.html.erb
<h1>検索結果</h1>
<ul>
  <% @search_results.each do |result| %>
    <!-- ここで検索結果の詳細を表示するコードを追加 -->
    <li><%= result.clumn_name %></li>
  <% end %>
</ul>

モデルへの記載

end_user.rb
.
.
  # 検索機能
  def self.search_for(content, method)
    if method == 'perfect'
      EndUser.where(name: content)
    elsif method == 'forward'
      EndUser.where('name LIKE ?', content + '%')
    elsif method == 'backward'
      EndUser.where('name LIKE ?', '%' + content)
    else
      EndUser.where('name LIKE ?', '%' + content + '%')
    end
  end
  .
  .
facility.rb
.
.
  def self.search_for(content, method)
    if method == 'perfect'
      Facility.where(area_name: content)
    elsif method == 'forward'
      Facility.where('area_name LIKE ?', content + '%')
    elsif method == 'backward'
      Facility.where('area_name LIKE ?', '%' + content)
    else
      Facility.where('area_name LIKE ?', '%' + content + '%')
    end
  end
  .
  .

ルーティング

routes.rb
get 'search', to: 'searches#search', as: 'search'

Discussion