LoginSignup
0
0

Ruby on Rails: Ransackを用いたモデル検索のエラー解決方法②

Posted at

この記事では、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 %>

このフォームからの検索結果が正しく処理されないという問題がありました。具体的には、検索結果が全て表示されてしまう、またはフォームからのパラメータが無視されてしまうという問題です。

解決方法

  1. コントローラーでの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やホワイトリストなどの設定が、検索キーに対して適切に機能することを確認します。
0
0
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
0
0