後へ      Topへ      次へ

ransack: 一覧の絞り込み

Books のように大量のデータを一覧表示する際、
カラム(Name や Category など) を指定して表示を絞り込めると便利です。

サンプルプログラムでは、GEM Ransack を使用します。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/d099d26

インストール

Gemfile に、
gem "ransack" と追記します。

bundle install

ransackable_attributes

モデルのファイルで、Ransack の絞込み対象となるカラムを指定します。

サンプルプログラムでは、
\app\models\book.rb 内に

def self.ransackable_attributes(auth_object = nil)
  ["name", "isbn", "category_id", "memo" ]
end

と書いて、4つのカラムを対象としています。

auth_object 引数は、
サンプルプログラムでは、使っていません。
ユーザーの権限に依って検索可能範囲を変えたい場合に使用します。
必要な場合は、後述の「コントローラ」を参照ください。

View

絞り込み内容を指定するコードを(自前で)書きます。

サンプルプログラムでは、
\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 で結果を取得できます。


後へ      Topへ      次へ