LoginSignup
10
4

More than 3 years have passed since last update.

[Ransack] ransackable_scopesには気を付けろ!

Last updated at Posted at 2020-09-10

結論

ransackable_scopesで実行するscopeに渡す引数が以下の値だったら
ArgumentError wrong number of arguments (given 0, expected 1)
が発生するから気を付けろ!!!

  • "true", "TRUE", "t", "T", 1, "1"
  • "false","FALSE","f","F",0,"0"

これらの値はそれぞれTrue, Falseに暗黙的に変換されるため、引数に渡せない。

解決策

config/initializers/ransack.rb
Ransack.configure do |config|
  config.sanitize_custom_scope_booleans = false
end

これを追記するだけで、上述の値全てを渡せるようになります1

渡せる値をカスタムしたいなら

諦めてください。
暗黙的に変換される値は Ransack::Constants::BOOLEAN_VALUES2 で定義されています。
この定数はfreezeされています。
公式によるとfreezeしたオブジェクトをunfreezeする方法は無いそうです。3

There is no way to unfreeze a frozen object.

変換される値のカスタマイズついてはかなり調べましたが、無理でした。。。
一応、「暗黙的に変換する値をカスタマイズできるようにしたよ!」って内容のPRがマージされていました。
これによると、以下のように変換する値をカスタマイズできるらしいです。

Ransack.configure do |config|
   config.truthy_values_to_convert_in_custom_scopes = ['TRUE', 'true', '1']
   config.falsey_values_to_convert_in_custom_scopes = ['FALSE', 'no way no how']
end

しかし、それ通りに記述しても以下のようなエラーが発生しました。

=> NoMethodError: undefined method `truthy_values_to_convert_in_custom_scopes' for Ransack:Module

ファッ!?!?!?!?!?!?!?!?!?!?!?!?
PRの実装内容をを確認しましたが、概要で書かれているような内容は実装されていませんでした。。。
誰かここ分かる方がいれば教えてください。。。

また、@t_oginoginさんがRansackを使わない解決策を提案してくれているので、皆さんの実装状況に合わせてご参考下さい。
https://qiita.com/t_oginogin/items/b45636d64c271ebc409c

参考文献

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4