はじめに
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への理解度も上がりますし、根源的なところを知っておくことは自分の実力に大きく関わってくると思うので。(底レイヤーなところまでは、カバーできていませんが、、)そのことを念頭におきつつ、二次情報なども活用することで、より理解度を高めていければなと思います。