Ruby on Rails 〜エラーメッセージ表示から日本語化〜

エラーメッセージの表示

エラーメッセージを表示させる設定

まずは、バリデーションで設定します。

validates :text, :image, presence: true

で空では保存できないようにします。

 

つぎに

コントローラーで保存できる場合の条件分岐を記述します。

def create

 @game = game.new

  if @game.valid?

  @game.save

  redirect_to root_path

 else

  render 'new'

 end

end

バリデーションで引っかかると、保存されずにnewアクションに戻る

ようにしています。

 

つづいて、

ビューです。

views/layoutsの下に「_error_messages.html.erb」ファイルを作ります。

<% if model.errors.any? %>
 <div class="error-alert">
  <ul>
   <% model.errors.full_messages.each do |message| %>
    <li class='error-message'><%= message %></li>
   <% end %>
  </ul>
 </div>
<% end %>

どのモデルにも対応できるように、「model.errors.any?」を記述しています。

最後にnew.html.erbファイルに

<%= render 'layouts/error_messages', model: form.object %>

を記述して、保存されなかったときに読み込まれエラーメッセージが表示されるようにします。 これで、エラーメッセージの設定は完了です。

日本語化

これでエラーメッセージを表示することができますが、英語表記になります。 「Text can't be blank」や「Image can't be blank」となります。

これを日本語に変換していきます。 config/application.rbを編集します。

# 中略
module game
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # 日本語の言語設定
    config.i18n.default_locale = :ja
      # 省略
    end
end

つぎは Gemfileを編集します。

gem 'rails-i18n'

記述できたら「bundli install」を実行します。

これで下記のサイトに記述のある日本語は変換されます

github.com

まだ、完全に日本語にできなていないので、様々な言語に対応できる言語ファイルの localeファイルを用意し、YAML形式で記述します。 YAML形式とは、ファイルの書き方のルールのことで、 文字だけで記述されているテキストのことです。

config/localesの下に「devise.ja.yml」ファイルを作ります。

github.com

からまるごとコピーして、devise.ja.ymlに貼り付けます。 これで、日本語化されます。

しかし… まだ日本語化されていないものもあります。 自身で名付けた「Nickname」や「text」などはそのまま表示されます。

config/localesの下に新たに「ja.yml」ファイルを作成します。

ja:
  activerecord:
    attributes:
      user:
        nickname: ニックネーム
      game:
        text: テキスト
        image: 画像

と変換したい文字を設定します。 これで、すべてが日本語化されました。 テストコードのエラーメッセージも変更されるので テストコードも変更を忘れずにしましょう!

エラーメッセージを指定する方法

バリデーションで

with_options numericality: { other_than: 1 }do
    validates :category_id
    validates :detail_id
    validates :delivery_fee_id
    validates :area_id
    validates :duration_id
  end

としてた場合 エラーメッセージは 「1以外の値を入力してください」 となります。

ユーザーからするとよくわからないですよね? たとえば 「〇〇を選択してください」 のほうがわかりやすです。

なので、エラーメッセージを変更します。

with_options numericality: { other_than: 1 , message: 'を選択してください' }do
    省略

とすることで変更できます。

バリデーションによっては

validates :name, presence: { message: 'は1文字以上入力してください。' }

という記述もあるので注意です。 詳しくは

railsguides.jp

を参照してください。