3. バリデーション(2)
2012/09/24 シナジーマーケティング(株) 寺岡 佑起
Model 3章 バリデーション
3.1. バリデーションとは
3.2. バリデーションの定義
3.3. バリデーションの実行タイミング
3.4. バリデーションエラーの確認
3.5. ビューへの表示
3.6. 組み込みのバリデーション
3.7. 共通のバリデーションオプション
3.8. 独自ロジックでのバリデーション
3.9. カスタムバリデータの作成
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
国際化対応の設定をしていない場合、エラーメッセージが英語で表示されてしまいます。
国際化対応については、別の章でご紹介する予定です。