質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

490閲覧

enumで取得したデータを他のビューファイルで表示できない(日本語化にならない)

Giants

総合スコア11

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2023/02/28 05:45

編集2023/03/01 13:50

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • enumで取得したデータを日本語化して各画面で表示させたい

前提

親モデル(post)にcountry/whiskey_typeのenumを定義し、セレクトボックスの実装を終え、正常に日本語化までできているのですが、データ保存後の詳細画面上では、
なぜか日本語化されず英語での表示になってしまいます。

https://haayaaa.hatenablog.com/entry/2019/02/20/212805

上記の記事を参考にして、
show.html.erbを、<%= country.name %> => <%= country.name_i18n %>
に変更したところ、下記のようなエラーになってしまいます。

どなた様か原因がわかる方がいましたら、ご教示ただければと思います。

発生している問題・エラーメッセージ

undefined method `name_i18n' for #<Country id: 4, name: "scotland", post_id: 4, created_at: "2023-02-28 13:42:00.487629000 +0900", updated_at: "2023-02-28 13:42:00.487629000 +0900"> Did you mean? name_change

Image from Gyazo

該当のソースコード

app/views/posts/show.html.erb

1一部抜粋 2 <div class="col-lg-6"> 3 <div class="card mb-3 mb-lg-0"> 4 <div class="card-body"> 5 <h3 class="my-3"><%= @post.title %></h3> 6 <h5 class="my-3"><%= @post.body %></h5> 7 <hr> 8 <h3 class="my-3"><%= t('.category')%></h3> 9 10 <p class="bi bi-trash2-fill"> <%= @post.whiskey_brand %></p> 11 12 <% @post.whiskey_types.each do |whiskey_type| %> 13 <p class="bi bi-bricks"> <%= whiskey_type.name %></p> 14 <% end %> 15 16 <% @post.countries.each do |country| %> 17 <p class="bi bi-globe-asia-australia"> <%= country.name_i18n %></p> 18 <% end %> 19 20 <i class="bi bi-cash-coin"> <%= @post.price %></i> 21 <%= render 'crud_menus', post: @post if current_user.own?(@post) %> 22 </div> 23 </div> 24 </div> 25一部抜粋

app/views/posts/_formhtml.erb

1<%= form_with model: post, local: true do |f| %> 2 <%= render 'shared/error_messages', object: f.object %> 3 <div class="form-group"> 4 <%= f.label :title %> 5 <%= f.text_field :title, class: 'form-control' %> 6 </div> 7 <div class="form-group"> 8 <%= f.label :body %> 9 <%= f.text_area :body, class: 'form-control', rows: 10 %> 10 </div> 11 <div class="form-group"> 12 <%= f.label :whiskey_brand %> 13 <%= f.text_field :whiskey_brand, class: 'form-control' %> 14 </div> 15 <div class="form-group"> 16 <%= f.fields_for :countries, post.countries do |country| %> 17 <%= country.label :name %> 18 <%= country.select :name, Post.countries_i18n.invert, {}, class: 'form-control' %> 19 <% end %> 20 </div> 21 <div class="form-group"> 22 <%= f.fields_for :whiskey_types, post.whiskey_types do |whiskey_type| %> 23 <%= whiskey_type.label :name %> 24 <%= whiskey_type.text_field :name, class: 'form-control' %> 25 <% end %> 26 </div> 27 <div class="form-group"> 28 <%= f.label :price %> 29 <%= f.text_field :price, class: 'form-control' %> 30 </div> 31 <div class="form-group"> 32 <%= f.label :post_image %> 33 <%= f.file_field :post_image, class: 'form-control mb-3', accept: 'image/*' %> 34 <%= f.hidden_field :post_image_cache %> 35 </div> 36 <%= f.submit class: 'btn btn-primary' %> 37<% end %>

app/models/post.rb

1class Post < ApplicationRecord 2 mount_uploader :post_image, PostImageUploader 3 4 belongs_to :user 5 has_many :comments, dependent: :destroy 6 7 validates :title, presence: true, length: { maximum: 255 } 8 validates :body, presence: true, length: { maximum: 65_535 } 9 validates :price, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 0} 10 validates :whiskey_brand, presence: true, length: { maximum: 255 } 11 validates :countries, presence: true 12 validates :whiskey_types, presence: true 13 14 has_many :countries, dependent: :destroy 15 accepts_nested_attributes_for :countries, allow_destroy: true 16 17 has_many :whiskey_types, dependent: :destroy 18 accepts_nested_attributes_for :whiskey_types, allow_destroy: true 19    enum country: { scotland: 0, ireland: 1, america: 2, canada: 3, japan: 4, taiwan: 5, india: 6, others: 7 }, _prefix: true 20    enum whiskey_type: { malt: 0, grain: 1, belended: 2, bourbon: 3, rye: 4, corn: 5, others: 6 }, _prefix: true 21end

app/models/country.rb

1class Country < ApplicationRecord 2 belongs_to :post, optional: true 3 validates :name, presence: true 4end

app/models/whiskey_type.rb

1class WhiskeyType < ApplicationRecord 2 belongs_to :post, optional: true 3 validates :name, presence: true 4end

config/locals/enums.ja.yml

1ja: 2 enums: 3 post: 4 country: 5 scotland: 'スコットランド' 6 ireland: 'アイルランド' 7 america: 'アメリカ' 8 canada: 'カナダ' 9 japan: '日本' 10 taiwan: '台湾' 11 india: 'インド' 12 others: 'その他' 13 whikey_type: 14 malt: 'モルト' 15 grain: 'グレーン' 16 belended: 'ブレンデッド' 17 bourbon: 'バーボン' 18 rye: 'ライ' 19 corn: 'コーン' 20 others: 'その他'

試したこと

<%= country.name %>の入力にすると下記のように国名が英語表記となってしまう。

Image from Gyazo

<%= country.name_i18n %> と記述するとエラーになってしまう。

希望は、ここの国名が日本語化されて表示されて欲しいです。

補足情報(FW/ツールのバージョンなど)

ruby:3.1.3
rails:6.1.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/02/28 07:24

enum_helpのインストールが失敗しているか、記事が書かれたときと使い方が変わっているか。
guest

回答1

0

ベストアンサー

Post の country は enumのようですから country_i18n はあるかも、ですが
Country の name は enum ではないので、 name_i18n はないですね。

@post.countries ってことは Post が has_many :countries ですか?
すると Post に enum country があるのも ???

model の関連(とenumがあるならそれも)を載せてください。

追記
Post の enum country、enum whiskey_type: はなんの役にも立っていません。Post に country、whiskey_type という integer な項目があるなら別ですが。
いまは 選択肢の定義として使っているようですが、それをするなら、model Country, WhiskeyType に定義すべきものです。

さて、、、
Country の field name が 'scotland ' だったら I18N で 'スコットランド' と表示する、というのは私の I18N力ではできません。
思いつくのは

  1. name を string から enum なinteger にする。
  2. name を enum にするが、enum name: { scotland: 0, ireland: 1, , , } ではなく enum name: { scotland: 'scotland', ireland:, 'ireland', , , } にする

1はできると思いますが、2は思いつきなのでできるかどうかはお試しを。
いずれにしても、Whiskey の産地が増える毎に 「Countryを増やす」のではなく、「enumを追加してから Countryを増やす」という、codeを触らなければならないのには強い違和感をいだきます。
I18N とはいえ、「フランス語やタイ語 などのサポートは考えておらず、英語と日本語だけ」でよいのなら name_en、name_jp とでもいうfieldを用意して、localeで切り分ける def name; locale == :en ? name_en : name_jp ; end ほうがメンテはらくですね。
いや、サポート言語は徐々に増やすのだ、ということでしたら config/locale の yml ではなく 辞書tableを作るのかな。I18Nの辞書をconfig/locale以外から取り込むという方法があると思うので、それを発見できたら 辞書tableから取り込めば I18Nでできます。見つからなかったら decolaterかな

投稿2023/02/28 11:49

編集2023/03/01 23:48
winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Giants

2023/02/28 12:25

ご教示いただきありがとうございます! postモデルとcountryモデル間でアソシエーションがございます。 下記よりモデル関連を添付いたします。 app/models/post.rb class Post < ApplicationRecord mount_uploader :post_image, PostImageUploader belongs_to :user has_many :comments, dependent: :destroy validates :title, presence: true, length: { maximum: 255 } validates :body, presence: true, length: { maximum: 65_535 } validates :price, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 0} validates :whiskey_brand, presence: true, length: { maximum: 255 } validates :countries, presence: true validates :whiskey_types, presence: true has_many :countries, dependent: :destroy accepts_nested_attributes_for :countries, allow_destroy: true has_many :whiskey_types, dependent: :destroy accepts_nested_attributes_for :whiskey_types, allow_destroy: true enum country: { scotland: 0, ireland: 1, america: 2, canada: 3, japan: 4, taiwan: 5, india: 6, others: 7 }, _prefix: true enum whiskey_type: { malt: 0, grain: 1, belended: 2, bourbon: 3, rye: 4, corn: 5, others: 6 }, _prefix: true
winterboum

2023/02/28 13:47

CODE は質問を編集して、<code>使って載せてください。 関連modelの方も載せて
Giants

2023/03/01 13:52 編集

返信が遅れてしまい、申し訳ございませんでした。 投稿を編集し、該当箇所のモデルを追加致しました。 ご確認のほどお願いします。
Giants

2023/03/02 01:01

ご丁寧に教えてくださいましてありがとうございます! 1.name を string から enum なinteger にする。 2.name を enum にするが、enum name: { scotland: 0, ireland: 1, , , } ではなく enum name: { scotland: 'scotland', ireland:, 'ireland', , , } にする 一度、1と2をそれぞれやってみて動き等を確認しながら進めてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問