[Rails]検索機能の追加
✅ビュー・検索フォームの作成(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 %>
Discussion