I18n::ArgumentErrorへの対処方法

結論

I18n.t(“”, scope: hoge, default: null)
第一引数が空文字(“”)だと、default: nullが効かず、I18n::ArgumentErrorが発生します。
なお、引数がnilの場合はnilが返され、ArgumentErrorは発生しません。
自分はuser.&department.blank? ? nil : I18n.t(user.&department, scope: “enums.status”)のように変更した。

お仕事でRailsのバージョンを6.0から6.1にアップデートしました。
その際に、I18n::ArgumentErrorが起きたので、関連しそうなgemのバージョンを確認すると、
railsのバージョンアップにより、
i18n (>= 0.7, < 2)だったものが、i18n (>= 1.6, < 2)になっている箇所が怪しそうでした。

エラー箇所を見てみるとlib/i18nの以下のコードで落ちてました。

      def translate(locale, key, options = EMPTY_HASH)
        raise I18n::ArgumentError if (key.is_a?(String) || key.is_a?(Symbol)) && key.empty? # ここ
# 確認
irb(main):020:0> data = nil
=> nil
irb(main):021:0> (data.is_a?(String) || data.is_a?(Symbol)) && data.empty?
=> false
irb(main):022:0> data = ""
=> ""
irb(main):023:0> (data.is_a?(String) || data.is_a?(Symbol)) && data.empty?
=> true

リリースノート: https://github.com/ruby-i18n/i18n/releases

I18nを使用する際に、I18n.t(user.&department, scope: “enums.status”, default: nil)のように、
引数に空文字(“”)が渡される可能性があるものは少し気をつけないといけないですね。
一旦三項演算子で、user.&department.blank? ? nil : I18n.t(user.&department, scope: “enums.status”)のように変更しました。
そして、今回のバージョンアップ関係なく、元々から空文字はエラーが出るようになっていたみたいですね。最初からエラー全部潰すのは難しいけど、バージョンアップの関係かどうかってわかりずらいのが辛いなぁ。

余談

v0.8.4で、第一引数にnullが入るとI18n::ArgumentErrorになるようにしていたのを、ならないようにもとに戻していますね。gemのcancanを壊してしまうのでって書いてるけど、cancan側がバージョンを下げることで解決したみたい?リリースノート見るの面白いですね。


コメント

タイトルとURLをコピーしました