6
6

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 5 years have passed since last update.

Rails6 のちょい足しな新機能を試す9(エラーメッセージのフォーマット編)

Last updated at Posted at 2019-05-02

はじめに

Rails 6 に追加されそうな新機能を試す第9段。 今回のちょい足し機能は、 full message 編です。
ymlファイルで指定できるエラーフォーマットが拡張されてます。

記載時点では、Rails は 6.0.0.rc1 です。 gem install rails --prerelease でインストールできます。

$  rails --version
Rails 6.0.0.rc1

プロジェクトを作成する

rails プロジェクトを作成します。

$ rails new sandbox6_0_0rc1

model を作る

$ cd sandbox6_0_0rc1
$ bin/rails g model User name email
$ bin/rails db:create db:migrate

model に validation を追加する

app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true
end

何もymlファイルに指定がないとき

何もymlファイルに指定がないときには、今までと同じ Name can't be blankEmail can't be blank になります。

$ bin/rails c
Running via Spring preloader in process 653
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):002:0> user.validate
=> false
irb(main):003:0> user.errors.full_messages
=> ["Name can't be blank", "Email can't be blank"]
irb(mail):004:0> exit

yml ファイルでエラーフォーマットを指定

エラーメッセージのフォーマット全体を指定してみます。

config/locales/en.yml
en:
  errors:
    format: '%{message}'

指定されたフォーマット (can't be blank だけ) にエラーメッセージが変わります。

$ bin/rails c
Running via Spring preloader in process 696
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):002:0> user.validate
=> false
irb(main):003:0> user.errors.full_messages
=> ["can't be blank", "can't be blank"]
irb(main):004:0> exit

実はここまでは、Rails 5.2.3でも同じです。

yml ファイルで model レベルでエラーフォーマットを指定

ここからが、Rails6のちょい足しです。
エラーメッセージのフォーマットを model レベルで指定してみます。

config/locales/en.yml
en:
  errors:
    format: '%{message}'
  activerecord:
    errors:
      models:
        user:
          format: '%{attribute} : %{message}'

では、エラーメッセージを確認してみましょう。
このとき、 ActiveModel::Errors.i18n_customize_full_message = true にします。

$ bin/rails c
Running via Spring preloader in process 1338
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> ActiveModel::Errors.i18n_customize_full_message = true
=> true
irb(main):002:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):003:0> user.validate
=> false
irb(main):004:0> user.errors.full_messages
=> ["Name : can't be blank", "Email : can't be blank"]
irb(main):007:0> exit

なお ActiveModel::Errors.i18n_customize_full_message はデフォルトでは、false です。
ActiveModel::Errors.i18n_customize_full_message = false のときは、modelレベルの設定は無視されます。

$ bin/rails c
Running via Spring preloader in process 1343
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> ActiveModel::Errors.i18n_customize_full_message
=> false
irb(main):002:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):003:0> user.validate
=> false
irb(main):004:0> user.errors.full_messages
=> ["can't be blank", "can't be blank"]
irb(main):005:0> exit

yml ファイルで attribute レベルでエラーフォーマットを指定

今度は、attribute レベルでエラーフォーマットを指定してみます。

config/locales/en.yml
en:
  errors:
    format: '%{message}'
  activerecord:
    errors:
      models:
        user:
          format: '%{attribute} : %{message}'
          attributes:
            name:
              format: '%{message} - %{attribute}'

では、試してみましょう。
name は、 '%{message} - %{attribute}' のフォーマットが適用され
email は、 '%{attribute} : %{message}' のフォーマットが適用されます。

$ bin/rails c
Running via Spring preloader in process 1383
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> ActiveModel::Errors.i18n_customize_full_message = true
=> true
irb(main):002:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):003:0> user.validate
=> false
irb(main):004:0> user.errors.full_messages
=> ["can't be blank - Name", "Email : can't be blank"]
irb(main):005:0>

i18n_customize_full_message の設定

今回、irb の中で動的に設定しましたが、 i18n_customize_full_message は、 config ファイルで設定できます。

config/application.rb
module Sandbox600rc1
  class Application < Rails::Application
     ...
    config.active_model.i18n_customize_full_message = true
  end
end

参考情報

6
6
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
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?