この記事では、Ruby on RailsでRansackを使った検索機能の設定方法について説明します。前回の記事では、Ransackの設定と関連するモデルへのホワイトリストの追加を行いました。今回は、フォームから送信されるパラメータに対する処理の方法と、検索結果を正しく絞り込むための対策に焦点を当てます。
前回の記事
背景
Railsアプリケーションで、Reservation
モデルに対して、顧客単位で検索を行う必要がありました。しかし、Ransackの設定やビューからのパラメータ処理に問題が生じ、検索が正常に動作しないという課題がありました。
エラー内容
フォームから検索を行うために、以下のように設定しました:
<%= search_form_for @r, url: reservations_path, method: :get, local: true, class: 'custom-form-group d-flex' do |form| %>
<div class="form-group d-flex align-items-end me-2">
<div class="w-100">
<label>顧客名検索:</label>
<%= form.search_field :customer_name_cont, id: 'single-simple-search-name_cont', class: 'form-control me-2', placeholder: '顧客名検索' %>
</div>
</div>
<%= form.submit '検索', class: 'btn btn-primary' %>
<% end %>
このフォームからの検索結果が正しく処理されないという問題がありました。具体的には、検索結果が全て表示されてしまう、またはフォームからのパラメータが無視されてしまうという問題です。
解決方法
-
コントローラーでの
params[:q]
の利用:変更前はparams[:r]を使用していたものをparams[:q]に変更する。
こうすることでコントローラーでの検索処理に対し、フォームからのパラメータを正しく受け取れるようになる。class ReservationsController < ApplicationController def index @r = Reservation.ransack(params[:q]) # フォームからのパラメータを`params[:q]`として受け取る @reservations = @r.result end end
このように
params[:q]
を使うことで、フォームからのパラメータが正しく受け取られ、Ransackによる検索処理が正常に行われます。
設定のポイント
-
フォームとコントローラーの連携: Ransackを用いる検索の場合、フォームから送信されるパラメータは
params[:q]
としてコントローラーに渡され、それに基づいて検索が行われます(インスタンス変数が@rになったからといって、パラメータがparams[:r]になることはないことに注意) -
Ransackの設定:
Reservation
モデルに対するカスタムransackerやホワイトリストなどの設定が、検索キーに対して適切に機能することを確認します。