🌟

Ransack needs attributes explicitly allowlisted... の対処法

2023/02/15に公開

Ransack needs attributes explicitly allowlisted as searchableとエラーが出た時の対処法

Ransackv4.0.0でBreaking Changeがありました。

[SECURITY] Require explict allowlisting of attributes and associations
(属性と関連付けのための明示的な許可リストが必要です)

今までは明示的な許可がなくても検索やソートが可能だったのですが、4.0.0から許可リストを作成しないと以下のようなエラーが発生します。

Ransack needs HogehogeModel attributes explicitly allowlisted as
searchable. Define a `ransackable_attributes` class method in your `HogehogeModel`
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:

class HogehogeModel < ApplicationRecord
  # ...
  def self.ransackable_attributes(auth_object = nil)
    ["created_at", "id", "hogehoge_1", "hogehoge_2", "hogehoge_3", "updated_at"]
  end
  # ...
end

エラー文に書いてある通りですが、絞り込み検索したいモデルにransackable_attributesメソッドを作成して、許可するカラムを書いてねということらしいです。

詳しくはドキュメントのAuthorization (allowlisting/denylisting)を見るのが良いかもしれません。

親モデルや子モデルを検索したい場合

親モデルや子モデルを検索しようとすると以下のようなエラーが発生します。

Ransack needs HogehogeModel associations explicitly allowlisted as
searchable. Define a `ransackable_associations` class method in your `HogehogeModel`
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:

class HogehogeModel < ApplicationRecord
  # ...
  def self.ransackable_associations(auth_object = nil)
    ["child_hogehoges", "hogehoge"]
  end
  # ...
end

こちらも同様にransackable_associationsメソッドに許可するモデルを書いてあげれば解決しました

エラー文やドキュメントを見ずに対応していたのですごく時間がかかったしまいましたが、ちゃんと読まないとダメですねー...

Discussion