目的
Railsで作成したアプリに検索機能を導入する。
開発環境
macOS: Big Sur
Rubyバージョン: 2.6.5
Railsバージョン: 6.0.0
前提
- アプリ
test-app
が作成されている。
【Rails】簡単な投稿アプリの作成
手順
ルーティングの設定
まず、ルーティングを設定していきます。
Rails.application.routes.draw do
#省略
resources :posts do
collection do
get 'search'
end
end
#省略
end
ルーティングの記載で、collection
とありますが、これを使用すると生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできます。
また他にもmember
があり、
collection
はルーティングに:idがつかない、member
は:idがつくという違いがあります。
今回の検索機能の場合は:id
を指定して特定のページにいく必要がないため、collection
を使用してルーティングを設定しました。
検索フォームの表示
まず、検索する際に必要なビューファイルを編集していきます!
<%= form_with url: search_posts_path, local: true, method: :get do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する" %>
<%= form.submit "検索" %>
<% end %>
これで検索に必要な検索窓と検索ボタンを作成できました!
メソッドの定義
次に検索のメソッドを定義します。
テーブルとのやりとりに関するメソッドなので、モデルに置きます。
コントローラーはあくまでモデルの機能を利用し処理を呼ぶだけで、複雑な処理は組まないことを意識します!
class Post < ApplicationRecord
#省略
def self.search(search)
if search != ""
Post.where('title LIKE(?)', "%#{search}%")
else
Post.includes(:user)
end
end
end
if search != ""
で検索フォームに何か入力があった場合のみ検索結果が表示されるように条件を付けています。
もし入力がない場合はすべての投稿を表示させます。
またPost.where('title LIKE(?)', "%#{search}%")
という記述で、Postモデルのtitle
を検索するようにしています。
アクションの定義
class PostsController < ApplicationController
#省略
def search
@posts = Post.search(params[:keyword])
end
end
Postモデルに書いたsearchメソッド
を呼び出しています。
searchメソッドの引数にparams[:keyword]
と記述して、検索結果を渡しています。
このときprivateメソッド
を指定している場合は、必要に応じて忘れずに記載しましょう!
検索結果ページの作成
検索結果を表示するビューファイルを作成します。
<% @posts.each do |post| %>
<%= post.title %>
<%= post.user.name %>
<% end %>
ここまで実装できたら実際に検索をしてみましょう!
検索結果が表示されれば成功です!
最後に
以上で検索機能の導入は完了です。
CSSを実装していないため、簡素な見た目となっています。
必要に応じて各自、実装してください。
では。