3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】検索機能の導入

Posted at

目的

Railsで作成したアプリに検索機能を導入する。

開発環境

macOS: Big Sur
Rubyバージョン: 2.6.5
Railsバージョン: 6.0.0

前提

手順

  1. ルーティングの設定
  2. 検索フォームの表示
  3. メソッドの定義
  4. アクションの定義
  5. 検索結果ページの作成

ルーティングの設定

まず、ルーティングを設定していきます。

config/routes.rb
Rails.application.routes.draw do
#省略
  resources :posts do
    collection do
      get 'search'
    end
  end
#省略
end

ルーティングの記載で、collectionとありますが、これを使用すると生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできます。

また他にもmemberがあり、
collectionはルーティングに:idがつかない、memberは:idがつくという違いがあります。

今回の検索機能の場合は:idを指定して特定のページにいく必要がないため、collectionを使用してルーティングを設定しました。

検索フォームの表示

まず、検索する際に必要なビューファイルを編集していきます!

app/views/posts/index.html.erb
<%= form_with url: search_posts_path, local: true, method: :get do |form| %>
  <%= form.text_field :keyword, placeholder: "投稿を検索する" %>
  <%= form.submit "検索" %>
<% end %>

これで検索に必要な検索窓と検索ボタンを作成できました!

メソッドの定義

次に検索のメソッドを定義します。
テーブルとのやりとりに関するメソッドなので、モデルに置きます。
コントローラーはあくまでモデルの機能を利用し処理を呼ぶだけで、複雑な処理は組まないことを意識します!

app/models/post.rb
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を検索するようにしています。

アクションの定義

app/controllers/posts_controller.rb
class PostsController < ApplicationController
#省略
  def search
    @posts = Post.search(params[:keyword])
  end
end

Postモデルに書いたsearchメソッドを呼び出しています。
searchメソッドの引数にparams[:keyword]と記述して、検索結果を渡しています。

このときprivateメソッドを指定している場合は、必要に応じて忘れずに記載しましょう!

検索結果ページの作成

検索結果を表示するビューファイルを作成します。

app/views/posts/search.html.erb
<% @posts.each do |post| %>
    <%= post.title %>
    <%= post.user.name %>
<% end %>

ここまで実装できたら実際に検索をしてみましょう!
検索結果が表示されれば成功です!

最後に

以上で検索機能の導入は完了です。
CSSを実装していないため、簡素な見た目となっています。
必要に応じて各自、実装してください。
では。

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?