LoginSignup
6
0

ActiveSupport::Inflectorでacronymを追加するときにはunderscoreメソッドへの影響にも注意が必要

Posted at

Railsで、以下のように acronym (略語) を追加することがあります。

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'HTTP'
end

主に、定数名で使ったり、humanizeで使ったりしたいときに設定すると思います。
今回、オートローダーを変更する際に、定数の検索方法が変わるということで、acronymを追加するかどうか、その影響を調査している際に当たりました。

acronym を登録したとき

API documentに書いてありましたので、引用します。

acronymで'HTTP'を設定したとき、camelizeの挙動が以下のようになります。

acronym 'HTTP'

camelize 'http'              # => 'HTTP'
camelize 'my_http_delimited' # => 'MyHTTPDelimited'
camelize 'https'             # => 'Https', not 'HTTPs'

String#camelizeも同様です

'http'.camelize              # => "HTTP"
'my_http_delimited'.camelize # => "MyHTTPDelimited"
'https'.camelize             # => "Https"

'https'をcamelizeするときはHTTPSにならないのは想像がつくのですが、逆に、underscoreをすると、

'HTTP'.underscore  # => "http"
'HTTPS'.underscore # => "http_s"

のように、影響してしまいます。
acronymに大文字が続く場合を想定しておく必要がありそうです

その他 オートローダーに関連して

classic オートローダーでは定数読み込みの際に、Railsガイドにあるように、

VATという定数に対してunderscoreが呼び出されてvatが生成され、これを元にvat.rbというファイルを検索することで、ファイルが正常に見つかります。

のようにunderscoreを使っていたようですが、zeitwerkではファイル名をcamelizeをするように変わったようです。

参考

6
0
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
6
0