ransackで”Ransack needs Item associations explicitly allowlisted as…”エラーが出た時の対処法

どうも、ヒロキです。

約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 Itemmodel

今回、検索対象となる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による検索ができるようになるはずです。

参考

Qiita
ransackで"Ransack needs attributes explicitly allowlisted..."のエラー解消法 - Qiita 概要ransackの4.0.0のアップデートでBreaking Changesがあり、そのうちの1つに[SECURITY] Require explict allowlisting of att…
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

愛知の34歳。無職で暇になり始めたプログラミング(Ruby on Rails)の忘備録をまとめたブログです。最近は別にやりたいことができたのでプログラミングほぼやっていません。気が向いたらまた再開するかも。僕の日常はメインブログの方で更新しています。

コメント

コメントする

目次