目次へ

3. バリデーション(2)

2012/09/24 シナジーマーケティング(株) 寺岡 佑起

3.4. バリデーションエラーの確認

バリデーションで発生したエラー情報は対象オブジェクトのerrorsに格納されます。
エラー情報が格納されているかどうかはerrors.blank?メソッドで確認することができます。

各フィールドで発生したエラー情報は、errors[:フィールド名]で取得できます。
同一のフィールドが複数の検証に失敗する可能性があるため、エラー情報は配列で返され、
エラーが発生していない場合は空の配列が返されます。

errors.blank?やerrors[:フィールド名]で情報を取得する際は、バリデーション処理は実行されず、
valid?やsaveメソッドで実行された際のエラー情報を確認することができます。

  employee = Employee.new
  employee.errors.blank? #  true
  employee.save          #  false
  employee.errors        # {:name=>["can't be blank"]}
  employee.errors[:name] # ["can't be blank"]

3.5. ビューへの表示

入力フォームでエラーが発生した場合、画面にエラー内容を表示し、利用者に再入力を促す必要があります。
以下は部分テンプレートを利用してフォームの上部にエラーメッセージを表示するサンプルです。

1. app/views/shared/_error_messages.html.erbに以下の部分テンプレートを作成します。

  <% if object.errors.present? %>
  <div class="errMessage">
    <h3>以下の内容を確認してください。</h3>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>

2. エラー情報を表示したい箇所で以下のようにrenderメソッドで部分テンプレートを呼び出します。

  <%= form_for(@person) do |f| %>
    <%= render 'shared/error_messages', :object => @person %>
    <p>
      <%= f.label :name %><br />
      <%= f.text_field :name %>
    </p>
    <p>
      <%= f.label :email %><br />
      <%= f.text_field :email %>
    </p>
    <p>
      <%= f.submit "保存" %>
    </p>
  <% end %>

エラーメッセージ表示のためのヘルパを提供しているライブラリもありますので、
こちらを利用することもできます。
dynamic_form

国際化対応の設定をしていない場合、エラーメッセージが英語で表示されてしまいます。
国際化対応については、別の章でご紹介する予定です。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp