💡

[Rails]検索機能の追加

2025/01/24に公開

✅ビュー・検索フォームの作成(form_with)

form_with ヘルパーは、Ruby on Rails のビューでフォームを生成するためのヘルパーメソッド。
フォームの作成が簡単になり、サーバーとのデータ送受信に関する設定も自動化される。

local: true :同期通信。ページ全体がサーバーにリクエストを送信し、結果を受け取った後、ページ全体を再描画する。
local: false(デフォルト):非同期通信。ページをリロードせずに、サーバーと部分的なデータのやり取りを行う。

<%= form_with url: search_path, method: :get, local: true do |f| %>
  <%= f.text_field :query, placeholder: "検索するタスク名を入力" %>
  <%= f.submit "検索" %>
<% end %>

上記は :query という名前を持つ入力フィールドを作成している。
HTMLだとこんな感じ。

<input type="text" name="query" placeholder="検索するタスク名を入力">

「Ruby」と入力して送信すると、"query"="Ruby"となる


✅コントローラ

def search
  # パラメータから検索ワードを取得
  query = params[:query]
  # 検索ロジックを実装(例: モデルのwhereメソッドを使用)
  @results = Task.where("title LIKE ?", "%#{query}%")
  # 検索結果をビューに渡す
  render :search
end

params[:query] フォームで入力された検索キーワードを取得。

Task.where("title LIKE ?", "%#{query}%")
Whereは、「ActiveRecordが提供するメソッド」
SQL の WHERE 条件に相当する部分をRubyコードで記述できる。
下記2つは、書き方が違うけど、同じことをしてる。

Task.where("title LIKE ?", "%#{query}%")
SELECT * FROM tasks WHERE title LIKE '%<queryの値>%';

私が作成したモデル(Task)は、ApplicationRecordを継承している=大元のActiveRecordを継承してるので、ActiveRecordが提供するメソッドが使用できる。
昨日まとめたことにつながる!

参考文献:Railsガイド Active Record の基礎


✅ルーティング設定

get 'search' searchというURLにGETリクエストが来た時のルートを定義。
to: 'tasks#search' リクエストが来たら、TasksControllerのsearchアクションを呼び出す。

get 'search', to: 'tasks#search'

✅ビュー・検索結果画面

present? メソッドは、変数の値が空かどうかで、その後の処理を変える。
@results に値が入っていれば、タスクのタイトルをリンクをつけた状態で出す
@results に値が空だったら、「該当する結果が見つかりませんでした。」の文を表示する。

<h1>検索結果</h1>
<% if @results.present? %>
  <ul>
    <% @results.each do |result| %>
      <li>
        <%= link_to result.title, task_path(result.id) %>
      </li>
    <% end %>
  </ul>
<% else %>
  <p>該当する結果が見つかりませんでした。</p>
<% end %>

参考文献:【Rails入門】presentメソッドの使い方まとめ

Discussion