どうも、ヒロキです。
約1年ぶりにRailsを再開しましたがほとんど忘れてしまい、、
今一からアプリを作りながら思い出し作業中ですが、その過程でransackを実装しようとしたら以下のエラーが出てしまいました。
RuntimeError (Ransack needs Item associations explicitly allowlisted as searchable. Define a `ransackable_associations` class method in your `Item` model, watching out for items you DON’T want searchable (for example, `encrypted_password`, `password_reset_token`, `owner` or other sensitive information). You can use the following as a base:
どうやら、ransack のバージョン4.0.0から検索対象のモデルに対しホワイトリストを登録しなければならなくなったようです。
当記事はそのエラー対処法の忘備録になります。
開発環境
- Ruby 3.3.4
- Ruby on Rails 7.2.0
- ransack 4.2.1
- M3 Pro Macbook Pro 14
- mac OS Sonoma (14.6.1)
モデル構造
僕が現在制作しているサンプルアプリのモデル構造です。
ransackでの検索対象はItemモデルのnameとします。
エラーの内容
以下、エラーログになります。
ActionView::Template::Error (Ransack needs Item associations explicitly allowlisted as
| searchable. Define a `ransackable_associations` class method in your `Item`
| model, watching out for items you DON'T want searchable (for
| example, `encrypted_password`, `password_reset_token`, `owner` or
| other sensitive information). You can use the following as a base:
|
| ```ruby
| class Item < ApplicationRecord
|
| # ...
|
| def self.ransackable_associations(auth_object = nil)
| ["post"]
| end
| # ...
上記ログの中でも以下の一文に注目。
Define a ransackable_associations
class method in your Item
model
今回、検索対象となるItemモデル(のnameカラム)に対し、ransackable_associations
を定義しろということですね。
ransackエラーへの対処法(ホワイトリストの登録)
対処法は、検索対象にしているモデル内にホワイトリストを登録するメソッドを作成し、検索に使用するカラムを明記する必要があります。
Itemモデルのnameカラムを検索対象にする場合、以下のように記述します。
def self.ransackable_attributes(auth_object = nil)
["name"] # 検索対象のカラム名
end
子モデルで検索している場合
ただ、今回僕が作成したサンプルアプリではPostモデル上でItemカラム内の検索をかけたいので、
Postモデル内にはアソシエーション先のモデル名(Item)を記述し、アソシエーション先でカラム名を記述します。
def self.ransackable_attributes(auth_object = nil)
["item"] # アソシエーション先のモデル名を記述
end
def self.ransackable_attributes(auth_object = nil)
["name"] # 検索対象のカラム名
end
これでransackによる検索ができるようになるはずです。
コメント