Books のように大量のデータを一覧表示する際、
カラム(Name や Category など) を指定して表示を絞り込めると便利です。
サンプルプログラムでは、GEM Ransack を使用します。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/d099d26
Gemfile に、
gem "ransack" と追記します。
bundle install
モデルのファイルで、Ransack の絞込み対象となるカラムを指定します。
サンプルプログラムでは、
\app\models\book.rb 内に
def self.ransackable_attributes(auth_object = nil)
["name", "isbn", "category_id", "memo" ]
end
と書いて、4つのカラムを対象としています。
auth_object 引数は、
サンプルプログラムでは、使っていません。
ユーザーの権限に依って検索可能範囲を変えたい場合に使用します。
必要な場合は、後述の「コントローラ」を参照ください。
絞り込み内容を指定するコードを(自前で)書きます。
サンプルプログラムでは、
\app\views\books\index.html.erb の
search_form_for 部分です。
基本的には、普通の文字列入力枠やプルダウンメニューなどになります。
form.submit で、絞り込み内容をパラメータに添えて、
コントローラを呼びます。
一覧表示のコードを Ransack 用に書き換えます。
サンプルプログラムでは、
@books = policy_scope(Book)
を
@q = policy_scope(Book).ransack(params.fetch(:q, {}))
@books = @q.result
にします。
更に、
ransackable_attributes の引数 auth_object に現在のユーザーを渡したいなら、
@q = policy_scope(Book).ransack(params.fetch(:q, {}), auth_object: current_user)
@books = @q.result
に変えます。
View から渡ってきた絞り込みパラメータを、
ransack(params.fetch(:q, {})) が受け取って、
実際の絞り込みを実行。
@q.result で結果を取得できます。