結論
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に暗黙的に変換されるため、引数に渡せない。
解決策
Ransack.configure do |config|
config.sanitize_custom_scope_booleans = false
end
これを追記するだけで、上述の値全てを渡せるようになります。1
渡せる値をカスタムしたいなら
諦めてください。
暗黙的に変換される値は Ransack::Constants::BOOLEAN_VALUES
2 で定義されています。
この定数は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
参考文献
-
sanitize_custom_scope_booleansについて(Ransack公式)
https://github.com/activerecord-hackery/ransack#using-scopesclass-methods ↩ -
BOOLEAN_VALUESの中身(Ransack公式)
https://github.com/activerecord-hackery/ransack/blob/c9cc20de9e0f7bab92e0579c85bed64d614d23de/lib/ransack/constants.rb#L26 ↩ -
unfreezeできない(Ruby公式)
https://ruby-doc.org/core-2.6.6/Object.html#method-i-freeze ↩