0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

エラーメッセージの抽出と日本語化

Posted at

#目次
①エラーメッセージの仕組み
②エラーメッセージのビューへの反映
③日本語の設定の方法

##①エラーメッセージの仕組み
インスタンス.errors.full_messagesとすると空の配列を返してくる。
バリデーションに引っかかった時に、エラーのメッセージが配列の中に、入る仕組みになっている。

仮にpostモデルにvalidates :trueと記述した際には、必ずpostモデルに何かしら入っていなければならない。その際に何も入力せずに保存した時の動きを確認する

コンソール
rails cと入力
post = Post.new(content:"") 不正なデータを入力
post.errors.full_messagesと入力すると以下の表示が返ってくる
[]
post.save  保存するとfalseが返ってくる
この時post.errors.full_messagesと入力すると
["Content can't be blank"]というメッセージが返ってくる

##②エラーメッセージのビューへの反映
エラーメッセージをビューに反映する際には、上記の配列から抜き出して表示をすれば良い。

ビューファイル
<% @post.errors.full_messages.each do |message| %>
 <%= message %>
<% end %>

##③日本語の設定の方法
②でエラーメッセージはビューで表示できたと思うが、表示が英語になっているはず。
英語表記から日本語に変更するには、以下の手順を踏む。

  1. gem 'rails-i18n'をGemfileに追加。
  2. bundle installしましょう。
  3. 一部日本語化を指定する設定用のja.ymlファイルを作成。
  4. configに設定を追加。
  5. 再起動

3について、
config/locales/models/に、ja.ymlというファイルを作成して、以下のようにカラム名と日本語の対応表を記述しなければいけない。

config/locales/models/
ja:
  activerecord:
    models:
      post: 投稿
    attributes:
      post:
        content: 投稿内容
      モデル名:
        カラム名:日本語表示
        

4について

config/application.rb
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]

上記の2文を追加すれば良い。これは、正規表現を使い、config/locales以下のディレクトリ内にある全てのymlファイルを読み込むように指示するものとなります。

※localeとは、多言語化用の言語ファイル。多言語化以外にも、何度も使う文言を一限管理するために使われる。住所、会社名、時間をフォーマットする時の形式、今日の日付を出力する時の形式などを管理するために使われる。

######※config.i18n.load_pathの設定でconfig/locales以下のどの階層のディレクトリも読み込ませるようにしておくことが大事。この記述があることでディレクトリを分けることでカテゴリごとにi18nのデータを管理することができる様になる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?