Railsのモデルのバリデーションエラーの扱い方について説明します。
errors
(エラーメッセージオブジェクト)、独自のエラーメッセージの追加、エラーメッセージの表示、日本語化について説明します。
動作確認
- Rails 4.1
目次
- モデル(model)のエラーメッセージ errors の使い方
- モデル(model)にエラーメッセージを追加
- ビューにモデルのバリデーションエラーを表示
- モデルのバリデーションエラーメッセージを日本語化
モデル(model)のエラーメッセージ errors の使い方
Railsのモデル(model)でバリデーションエラーが発生した場合に、model のerrors
にエラーメッセージが設定されます。さらに、full_messages
でバリデーションのエラーメッセージの配列を取得できます。次のProductモデルが設定されている前提で話を進めます。
# app/models/product.rb class Product < ActiveRecord::Base # name属性に値が存在しない場合バリデーションエラーになります validates :name, presence: true end
コンソールで動きを確認します。
$ rails console --sandbox # バリデーションエラーが発生する場合 > product = Product.new => #<Product id: nil, name: nil, price: nil, discontinued: nil, created_at: nil, updated_at: nil> > product.valid? # バリデーションエラーが発生し、errorsにメッセージが登録される => false > product.errors.messages => {:name=>["can't be blank"]} > product.errors.full_messages => ["Name can't be blank"] > product.save => false # バリデーションエラーが発生しない場合 product = Product.new( name: "商品名" ) => #<Product id: nil, name: "商品名", price: nil, discontinued: nil, created_at: nil, updated_at: nil> irb(main):017:0> product.valid? # バリデーションエラーが発生しない。errorsにメッセージが登録されない。 => true > product.errors.messages => {} > product.errors.full_messages => [] > product.save => true
モデル(model)にエラーメッセージを追加
errors.add
とerrors[:base]
を使うことでエラーメッセージを自分で追加することができます。
class Product < ActiveRecord::Base validate :add_error_sample def add_error_sample # nameが空のときにエラーメッセージを追加する if name.empty? errors.add(:name, "に関係するエラーを追加") errors[:base] << "モデル全体に関係するエラーを追加" end end end
エラーが発生したときの画面です。
逆に、エラーメッセージを削除するメソッドもあります。
product = Product.new product.valid? # => false product.errors.full_messages # => ["Name can't be blank"] product.errors.clear # エラーメッセージを削除 product.erros.empty? # => true
ビューにモデルのバリデーションエラーを表示
モデルのバリデーションエラー時に、ビューにバリデーションエラーを表示します。
# 通常はフォームの表示領域の上部に記載 <% if @product.errors.any? %> <div id="error_explanation"> <h2><%= @product.errors.count %>件のエラーがあります。</h2> <ul> <% @product.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %>
モデルのバリデーションエラーメッセージを日本語化
日本語にする場合は次を実施して下さい。
- ja.ymlを
config/locales/
に追加 config/application.rb
にconfig.i18n.default_locale = :ja
を追加- サーバーを再起動
さらにモデルの属性名(nameなど)を日本語化する場合は、ja.yml
に次のように記載して下さい。
# config/locales/ja.yml ja: attributes: name: 名前 ...