libro
www.tuyano.com
初心者のためのRuby on Rails3入門

バリデーションによる値の検証 (3/5)

作成:2012-10-28 19:03
更新:2012-10-28 19:03

■コントローラーとビューをチェックしよう

モデルにバリデーションを設定しているのはよくわかりました。では、バリデーションを利用するにはどのようにすればよいのでしょう。実際に処理を行なっているコントローラーを見てみましょう。

コントローラーは、LunchesControllerというクラスとして用意されています。この「create」というメソッドで、送信されたフォームの処理を行なっています。実際にこのメソッドの中身をチェックしてみましょう。scaffoldで生成されたコードでは、respond_toといったものを使って表示をHTMLやJSONで取得するための処理などが用意されていますが、送信されたフォームによるレコードの保存に絞っていえば、実行されているのは以下の2文だけです。
@lunch = Lunch.new(params[:lunch])
@lunch.save

送信されたフォームのパラメータを使ってLunchインスタンスを作り、saveで保存をする、これだけです。「バリデーションを使った値のチェックの処理がない?」――その通り。バリデーションによる値のチェックは、私たちがスクリプトとして書いておく必要は全くないのです。saveをすると、必ずRailsのシステムによって値のチェックが行われ、エラーあれば保存はされず再入力するようになるのです。実に素晴らしい!


■ビューのエラー表示をチェックしよう

では、フォームの表示はどのように行なっているのでしょうか。新規作成のフォームを表示するnew.html.erbでは、フォームを_form.html.erbというパーシャルによって作成しています。この_form.html.erbの中身を調べてみると、下にあるリストのようになっていることがわかります。

中でも重要なのは、エラーメッセージの表示を行なっている部分です。これは整理すると以下のようになります。

1.  if @lunch.errors.any? でエラーがあるかチェックする。
2. @lunch.errors.count でエラー発生数を表示する。
3. @lunch.errors.full_messages.each do |msg| でエラーメッセージを順に取り出し表示する。

モデルのインスタンスにあるメソッドで必要な処理がされていることがわかるでしょう。見ると、「errors」というプロパティを使っていますね。これは、バリデーションで発生したエラーを管理するオブジェクトが保管されているプロパティです。この中に用意されているメソッドを呼び出すことで、発生したエラーに関する情報が得られます。ここでは、以下のようなものを利用しています。

any?――エラーメッセージが何かあるか調べる。何かのメッセージがあればtrueになる。
count――保管されているエラーメッセージの数を返す。
full_messages――保管されたメッセージをまとめてとりだす。

これらのうち、説明が必要なのはfull_messagesでしょう。これは、メッセージを配列にまとめて取り出します。ですから、eachなどを使ってそこからすべての項目を取り出し処理することができます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

<%= form_for(@lunch) do |f| %>
  <% if @lunch.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@lunch.errors.count, "error") %> prohibited this lunch from being saved:</h2>

      <ul>
      <% @lunch.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :star %><br />
    <%= f.number_field :star %>
  </div>
  <div class="field">
    <%= f.label :genre %><br />
    <%= f.text_field :genre %>
  </div>
  <div class="field">
    <%= f.label :memo %><br />
    <%= f.text_area :memo %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
※関連コンテンツ

「初心者のためのRuby on Rails3入門」に戻る