はじめに
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 を追加する
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true
end
何もymlファイルに指定がないとき
何もymlファイルに指定がないときには、今までと同じ Name can't be blank
と Email 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 ファイルでエラーフォーマットを指定
エラーメッセージのフォーマット全体を指定してみます。
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 レベルで指定してみます。
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 レベルでエラーフォーマットを指定してみます。
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 ファイルで設定できます。
module Sandbox600rc1
class Application < Rails::Application
...
config.active_model.i18n_customize_full_message = true
end
end