はじめに
@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アクションのルーティングを設定
collection
とmember
を使用してルーティングをカスタマイズしていきます。
これらを使用することで、ルーティングの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を作成します。
おわりに
自分の記録用にと投稿しましたが、誰かのお役に立てれば幸いです。
ここまで閲覧して下さり、ありがとうございました。