4
4

More than 3 years have passed since last update.

Rails label_tag 英語が小文字表示になってしまう(humanize)

Last updated at Posted at 2020-08-30

はじめに

label_tagを用いてフォームを作成していた時に*** IDをnameに指定しても表示が*** idとなってしまうことが起きたので、Railsのソースコードを読んで小文字変換されてしまう理由を調べてみました。

前提として


<%= label_tag '*** ID' %>

> *** id

ソースコード

# File actionview/lib/action_view/helpers/form_tag_helper.rb, line 215
def label_tag(name = nil, content_or_options = nil, options = nil, &block)
  if block_given? && content_or_options.is_a?(Hash)
    options = content_or_options = content_or_options.stringify_keys
  else
    options ||= {}
    options = options.stringify_keys
  end
  options["for"] = sanitize_to_id(name) unless name.blank? || options.has_key?("for")
  content_tag :label, content_or_options || name.to_s.humanize, options, &block
end

引用先
https://api.rubyonrails.org/

これを見ると、option類は何も渡していないので、content_or_options, options, blockは引数として渡していないことが分かります。
コードを読んでいくと、最後のname.to_s.humanizeが怪しそうだったのでhumanizeについて調べてみましょう。

humanize

属性名(英語)を調整してくれるメソッド
具体的には

  • 先頭にアンダースコアがある場合は削除

  • 末尾に"_id"がある場合は削除

    • オプションのパラメータ keep_id_suffix を true (デフォルトは false) に設定することで、末尾の '_id' を保持して大文字化
  • アンダースコアがあれば、スペースに置き換え

  • 頭文字を除くすべての単語を小文字に

  • 最初の単語を大文字に

    • 最初の単語の大文字化は、 :capitalize オプションを false に設定することでオフにすることができる(デフォルトは true)。

humanize('news_number')                  # => "News number"
humanize('news_id')                        # => "News"
humanize('news_id', capitalize: false)     # => "news"
humanize('_id')                              # => "Id"
humanize('news_id', keep_id_suffix: true)  # => "News Id"

今回の場合だと


humanize('ニュース ID')  # => "ニュース id"

頭文字を除くすべての単語を小文字にこちらが適応されていてidが小文字になってしまっていたということでした。

最後に

ロジックを知るためにRailsのソースコードを読むということが良いとわかっていても、二次情報に頼りがちだったので、ちゃんと読んでいかないとダメですね。railsへの理解度も上がりますし、根源的なところを知っておくことは自分の実力に大きく関わってくると思うので。(底レイヤーなところまでは、カバーできていませんが、、)そのことを念頭におきつつ、二次情報なども活用することで、より理解度を高めていければなと思います。

4
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
4
4