🌊

Rails i18n攻略:MVCのデータフローから解き明かす『ラベル翻訳失敗』の深層

に公開

Rails初学者の私が、掲示板作成画面の実装中に直面した「フォームラベルだけが日本語にならない」という謎。
ja.ymlの設定は完璧で、他の画面では動いているのになぜ……?

結論から言うと、原因はi18nの設定ミスではなく、MVC間での「変数名のタイポ」によるバケツリレーの失敗でした。
本記事では、この苦戦したデバッグ作業の備忘録として、以下の3点を軸に「なぜラベルが英語のままだったのか」を技術的に整理します。

  • MVCアーキテクチャにおける各要素の役割

  • 遷移状態のデータがどこで欠落したのか

  • binding.pry を駆使したi18n接続状態の追い方

同じように「設定は合っているはずなのに!」と頭を抱えている初学者の方の助けになれば幸いです。


1. MVCアーキテクチャから見る今回の役割

Railsのフォームラベルが国際化されるには、Model・View・Controllerの3つが正しく連携する必要があります。

要素 役割 今回の状態
Model ja.yml に定義された翻訳データを持つ 正常(Boardモデルに定義あり)
Controller Viewに渡すインスタンスを生成する 異常(変数名の不一致)
View 受け取ったインスタンスを元にラベルを描画 正常(form_withを使用)

2. 遷移状態のデータ:なぜ「Title」と表示されたのか

f.label :title が実行される際、Rails内部では以下の優先順位で表示内容を決定します。

  1. f.label :title, "カスタム名" のように直接指定があるか
  2. f.object(モデル)が翻訳データを持っているか
  3. 1, 2がない場合、シンボル(:title)を人間が読める形式(.humanize)に変換する

今回のデバッグログを確認すると、f.objectnil になっていました。

[3] pry> f.object
=> nil

このため、Railsは「どのモデルの翻訳を探せばいいか」を判断できず、最終手段として :title"Title" と表示したのです。

3. binding.pry によるI18n接続状態の検証

binding.pry を使用して、各フェーズでの翻訳データの「生存確認」を行いました。

① YAML・I18n設定の確認

まず、Railsシステム自体が翻訳データを認識しているか確認します。

[11] pry> I18n.t('activerecord.attributes.board.body')
=> "本文"
[12] pry> I18n.locale
=> :ja

結果:システムの設定は完璧でした。

② Viewでの変数生存確認

次に、Controllerから渡されたはずの変数を確認します。

[7] pry> @board
=> nil  # 本来あるべき変数が空

[8] pry> @boards
=> #<Board:0x00... > # 複数形の変数にデータが入っていた

原因特定: Controllerで @boards = Board.new と定義していたため、View側の form_with model: @board(単数形)にデータが渡っていませんでした。

③ 擬似的な接続テスト(おまけ)

もし正しい変数が渡っていたらラベルはどうなるか、その場でシミュレーションします。

[3] pry> f_test = ActionView::Helpers::FormBuilder.new(:board, @boards, self, {})
[5] pry> f_test.label :title
=> "<label for=\"board_title\">タイトル</label>"

確信: インスタンスさえ正しく渡れば、i18nは正常に動作することが証明されました。

4. 課題解決:Controllerの修正

MVCのバケツリレーを正常化させるため、Controllerの変数名を修正します。

app/controllers/boards_controller.rb
def new
  # 修正前: @boards = Board.new
  @board = Board.new 
end

まとめ:i18nエラーの教訓

「翻訳が効かない」=「翻訳ファイルのミス」とは限りませんでした。

  • Viewの翻訳(t('.'))は成功するのにラベルだけ失敗する場合、オブジェクトが正しくフォームに渡っていない可能性があります。
  • binding.pryf.object を確認しましょう。
  • Railsの基本である 「単数形と複数形」 の使い分けが、i18nという機能にも影響を与えることがわかりました(あたりまえか)。

データの流れ(データフロー)を意識することが、Railsデバッグの最短ルートという教訓改めて感じました。

以上、

Discussion