LoginSignup
0
0

検索フォームを用いての検索機能の実装

Last updated at Posted at 2023-12-12

はじめに

@rinrin_abc1818 です。
今回は自身のアプリケーションに検索機能を実装したのでそちらの保存用に投稿します。

筆者はプログラミング経験半年です。
至らない点があるかと思いますので、その際はご指摘いただけると幸いです。

概要

現在Ruby on Railsを用いて投稿型のアプリケーション作成中です。
ユーザー管理機能、投稿機能と終えて、現在は検索機能に取り組んでいます。

今回検索機能として、一覧ページ下部の検索フォームと詳細検索ページの二つを実装したのですが、今回は検索フォームでの検索機能についてまとめました。

検索フォームでの検索機能の実装

1.検索フォームについて

検索フォーム自体はform_withを使用します。

<%= form_with(url: search_path, method: :get) do |form| %>
  <%= form.text_field :query, placeholder: "キーワードを入力" %>
  <%= form.submit "検索" %>
<% end %>

2.searchアクションのルーティングを設定

collectionmemberを使用してルーティングをカスタマイズしていきます。
これらを使用することで、ルーティングのURLとコントローラーを自由にカスタムできます。
今回はidを指定して特定の詳細ページに遷移せず、検索結果を一覧として表示するので、collectionを使用します。
idを指定する必要がある場合は、URLに:idを含むmemberを使用します。

Rails.application.routes.draw do
devise_for :users
root to: 'rehas#index'

resources :rehas, only: [:new, :create, :show, :edit, :update, :destroy] do
  collection do
    get 'search'
  end
end
end

3.searchメソッドをモデルに定義する

上記で使用しているsearchメソッドは現時点では未定義であるため、ここでどのような処理を行うかを定義していきます。

ここでwhereメソッドとLIKE句を使用します。

whereメソッド
モデル.where('検索対象となるカラムを含む条件式')
上記のように引数部分に条件を指定することで、テーブル内の「条件に一致したレコードのインスタンス」を配列の形で取得できる

LIKE句
「1文字目に'a'という文字列が入ったデータ」や「最後の文字に'b'が入っているデータ」、「文字列の途中に'c'が入ったデータ」など曖昧な文字列を検索する際に使用する

これらを考慮し以下の記述を対応するモデルに記述します。

  def self.search(search)
    if search != ""
      Reha.where('text LIKE(?)', "%#{search}%")
    else
      Reha.all
    end
  end

"%#{search}%"この記述によって、入力された記述を含む投稿を検索するという処理になります。

4.コントローラーにsearchアクションを定義する

  def search
    @rehas = Reha.search(params[:query])
  end

5.ビューを作成する
search.html.erbを作成します。

おわりに

自分の記録用にと投稿しましたが、誰かのお役に立てれば幸いです。
ここまで閲覧して下さり、ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0