読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Railsのモデルのバリデーションエラー errors や full_messages の使い方

Rails初級 Rails Model

Railsのモデルのバリデーションエラーの扱い方について説明します。
errors(エラーメッセージオブジェクト)、独自のエラーメッセージの追加、エラーメッセージの表示、日本語化について説明します。

動作確認

  • Rails 4.1

目次

  1. モデル(model)のエラーメッセージ errors の使い方
  2. モデル(model)にエラーメッセージを追加
  3. ビューにモデルのバリデーションエラーを表示
  4. モデルのバリデーションエラーメッセージを日本語化

モデル(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.adderrors[: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

エラーが発生したときの画面です。
f:id:nipe880324:20140809021320p:plain:w380


逆に、エラーメッセージを削除するメソッドもあります。

product = Product.new
product.valid? # => false
product.errors.full_messages # => ["Name can't be blank"]
product.errors.clear  # エラーメッセージを削除
product.erros.empty? # => true

ビューにモデルのバリデーションエラーを表示

モデルのバリデーションエラー時に、ビューにバリデーションエラーを表示します。
f:id:nipe880324:20140809012601p:plain:w380

# 通常はフォームの表示領域の上部に記載
<% 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 %>

モデルのバリデーションエラーメッセージを日本語化

日本語にする場合は次を実施して下さい。

  1. ja.ymlconfig/locales/に追加
  2. config/application.rbconfig.i18n.default_locale = :jaを追加
  3. サーバーを再起動

さらにモデルの属性名(nameなど)を日本語化する場合は、ja.ymlに次のように記載して下さい。

# config/locales/ja.yml
ja:
  attributes:
    name:   名前
...

参考文献

以上です。
分からない箇所や間違いがある場合は、コメントを頂けると嬉しいです。