LoginSignup
0
0

Rails エラーメッセージの表示方法

Posted at

はじめに

RUNTEQに入学して2ヶ月の学習者です。
間違い、改善点等ありましたらコメントいただけると嬉しいです。

1.なぜこの記事を作ったのか

エラーメッセージを出そうとしたが、方法が分からなかった。エラーメッセージについての知識が足りていないので備忘録にする。

2.環境

  • ruby 3.2.2
  • Rails 7.1.2

3.エラーメッセージについて

user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
  • 上の画像はNameの値を空にしてユーザーを作成しようとしたもの。
  • エラーメッセージは、カラムにバリデーションを設定し、バリデーションの条件を満たさないデータが出来る時に生成される。アプリを使用するユーザーに向けて、何故エラーが出たのかを教えることが出来る。

どうやってメッセージは生成されるのか

rails g scaffold User name:string age:integer

アプリケーション作成後、scaffoldで基盤の作成、先ほどのバリデーションのみ設定してコンソールで確認する。

console
irb(main):001> user = User.new(name: "", age: 20)
=> #<User:0x0000000108cbb3b8 id: nil, name: "", age: 20, created_at: nil, updated_at: nil>
irb(main):002> user.errors
=> #<ActiveModel::Errors []>
irb(main):003> user.save
=> false
irb(main):004> user.errors
=> #<ActiveModel::Errors [#<ActiveModel::Error attribute=name, type=blank, options={}>]>
irb(main):005> user.errors.full_messages
=> ["Name can't be blank"]
  • irb(main):001>
    ユーザーの作成。nameの値はバリデーションエラーとなるようにした。

  • irb(main):002>
    この時点ではerrorsメソッド内は空。errorsメソッドはエラー情報を格納する。

  • irb(main):003>
    保存してみるが失敗。saveメソッド内でバリデーションを実行している。

  • irb(main):004>
    errorsメソッド内にエラー情報が格納されている。

  • irb(main):005
    errors.full_messagesメソッドによりエラーメッセージが配列化されている。

エラーメッセージの表示方法

rails g scaffoldにて自動生成されたものを見ていきます。

users/_form.html.erb
<%= form_with(model: user) do |form| %>
  <% if user.errors.any? %>
    <div style="color: red"> 
      <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
        <% user.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  
<!-- 以下割愛します -->
  • <% if user.errors.any? %>
    errorsメソッド内に値がある時にエラーメッセージフォームを表示

  • <%= pluralize(user.errors.count, "error") %>
    エラー件数の表示
    pluralizeヘルパーは第一引数の数をに合わせて、第二引数の英語を複数形にしてくれる。一応日本語ローマ字でも複数形なっていました。
<br>
<%= pluralize(1, "apple") %>
<%= pluralize(2, "apple") %>
<%= pluralize(1, "mouse") %>
<%= pluralize(2, "mouse") %>
<%= pluralize(1, "omoti") %>
<%= pluralize(2, "omoti") %>
  • <% user.errors.each do |error| %>
    eachメソッドでerrorsメソッドのエラー情報を取り出して、full_messageで一件づつ表示させる。

ステータスを設定しないとメッセージが表示されない

users_controller.rb
def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to user_url(@user), notice: "User was successfully created." }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

status: :unprocessable_entityのステータスを設定しないとページが再描画されなくてエラーメッセージが表示されません。rails g scaffoldでは初期設定で記述はあります。

4.エラーメッセージの日本語化

このまま設定してもエラーメッセージは英語で表示されてしまいます。なのでrails-i18nというジェムをインストールして日本語設定をします。

  • バージョン rails-i18n (7.0.8)

この記事はエラーメッセージの表示方法の備忘録なのでrails-i18nと、コードの詳細は端折って記述していきます。

手順

gem "rails-i18n"

Gemfileに記述してbundle install

rails-i18n (7.0.8)
      i18n (>= 0.7, < 2)
      railties (>= 6.0.0, < 8)

Gemfile.lockを見るとインストールされている。サーバーを起動していれば再起動する。

config/application.rb
class Application < Rails::Application

    config.i18n.default_locale = :ja
end

クラス内へconfig.i18n.default_locale = :jaを追記。

config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: 名前

localesディレクトリ内へja.ymlを作成し上記のコードを記述。

左がja.yml記述前で右が記述後です。カラムが翻訳されています。
「を入力してください」が翻訳されているのは、rails-i18nのgithubを見ると、localeディレクトリ内にあるja.ymlから翻訳されていることが分かります。

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