Rails6.0のエラーメッセージを日本語にする方法を忘れないように記事にします。
間違いなどありましたらご指摘いただければ幸いです。
準備
class Post < ApplicationRecord
validates :text, :image, presence: true
end
上記は例です。
モデルにバリデーションを設定します。
def create
@post = Post.new(post_params)
if @post.valid?
@post.save
redirect_to root_path
else
render 'new'
end
end
上記は例です。
コントローラーで保存処理の部分に条件分岐を記載します。
保存できればルートにリダイレクトして、保存できなければ投稿画面に戻る等です。
次にエラーメッセージ用のviewファイルを作ります。
view/layouta
配下に_error.html.erb
のような名前でファイルを作成します。
部分テンプレートで使いまわせるように_(アンダーバー)
を忘れずに。
<% if model.errors.any? %>
<div class="error">
<ul>
<% model.errors.full_messages.each do |message| %>
<li class='error-message'><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
上記のようにどのモデルでも対応できるように<% if model.errors.any? %>と記述します。エラーメッセージを
each doで
message`に入れて表示させます。
<%= render 'layouts/error', model: form.object %>
エラーメッセージを表示させたい部分には上記のように記述します。
うまく保存の処理ができなかった場合にrenderメソッドで_error.html.erb
を呼び出し表示させます。
言語設定
module <アプリ名>
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.0
# 以下を追加
config.i18n.default_locale = :ja
# 省略
end
end
上記のようにconfig/application.rb
をconfig.i18n.default_locale = :ja
と編集します。
Gemの導入
日本語に対応しているlocaleファイルであるrails-i18n
というGemを導入します。
rails-i18n
rails-i18nに登録されている日本語
gem 'rails-i18n'
Gemfileの一番下にgem 'rails-i18n'
と記述します。
bundle install
忘れずbundle install
してください。
ここまで実施するとエラーメッセージが「Textを入力してください」みたいに中途半端な日本語で表示されます。
ここから完全に日本語にしていきます。
日本語用localeファイル作成
localeファイルはconfig/locale
配下にあります。
デフォルトではen.yml
というファイルがあり、
deviseを導入していればdevise.en.yml
というファイルが存在していると思います。
config/locales
配下にdevise.ja.yml
というファイルを作成します。
[devise-i18n]8https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml)
上記のサイトのコードを全てコピーしてdevise.ja.yml
に貼り付けます。
少しでもインデントが変わるとエラーになるため気をつけてください。
このままだと自分で作成したNickname
とかImage
とかのカラムはまだ日本語にならないので
新たにja.yml
というファイルをconfig/locale
配下に作成します。
ja:
activerecord:
attributes:
user:
nickname: ニックネーム
tweet:
text: テキスト
image: 画像
上記のように自分で作ったカラムをどう表示させたいか記述します。
こちらも少しでもインデントが変わるとエラーになるので注意です。
これで全て日本語化したエラーメッセージできました。
deviseのエラーメッセージ日本語化
ちなみにdeviseでユーザー認証を取り入れている場合は新規登録は元々用意されているもので特に変更しなくてOKですが
ログインについては少し変更が必要みたいです。
<div class="contents row">
<div class="container">
<div class="new-head">
<h2>ログイン</h2>
</div>
# 以下を追加
<div class='login-flash-message'>
<%= flash[:notice] %>
<%= flash[:alert] %>
</div>
<%= form_with model: @user, url: user_session_path, id: 'new_user', class: 'new_user', local: true do |f| %>
# ここまで追加
# 省略
上記のようにviewを変更することで対応できます。
以上です。