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

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

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

■メッセージを日本語化するには?

scaffoldのエラーメッセージは、単純に英語のメッセージをまとめて表示する、というだけのものでした。が、もうちょっと使いやすくしたいですね。まず、メッセージを日本語にしましょう。

下のリスト欄に、修正したモデルのスクリプト(lunch.rb)のリストを掲載しておきました。日本語を使う場合、冒頭に「# coding: utf-8」をつけてエンコードを明示的にUTF-8に指定するのを忘れないでください。

ここでは、それぞれのバリデーション部分に「:message => ○○」といったオプションが用意されています。これが、エラーメッセージを指定するためのものです。

numericalityの場合は、値として用意されているハッシュに:message => ○○といった項目を追加するだけですみます。が、presenceの場合は、値がtrueですね。こうしたものは、trueの代りにハッシュを値として用意し、その中にmessageを用意します。要するに、「必要なオプションが全く無ければtrueだけでいいが、1つでもあるならハッシュにする」というわけです。


■それぞれのフィールドにエラーメッセージを表示するには?

エラーメッセージについてもう1つ考えたいのは、「まとめて表示するのではなくて、各フィールドごとにメッセージを表示したい」ということでしょう。

これは、ビューテンプレートを修正することで対応できます。下のリスト欄に修正リストを掲載しておきました。とりあえず、ここではnamestarにだけ、メッセージ表示の処理を用意しておきました。

例として、nameのエラー表示の処理部分を見てみましょう。このようになっていることがわかりますね。
<% @lunch.errors[:name].each do |msg| %>
      <br /><%= msg %>
<% end %>
@lunch.errors[:name]というようにしてエラーメッセージの情報を取得しています。errorsのオブジェクトは、full_messagesの他にもメッセージを取得するための仕組みがあるのです。errors[:コラム]というようにコラム名を指定することで、そのコラムで発生したエラーメッセージだけを取り出すことができます。

注意したいのは、このエラーメッセージもやはり配列である、という点です。1つのコラムに複数のバリデーションを設定する場合もありますから、2つのコラムに複数のエラーが発生することもあるためです。

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

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

●プログラム・リスト●

※Lunchモデルのスクリプト

# coding: utf-8
class Lunch < ActiveRecord::Base
  attr_accessible :genre, :memo, :name, :star
  
  validates :name, :presence => {:message => "nameは必須項目です。"}
      
  validates :star, 
    :numericality => {
      :only_integer => true,
      :message => "starは整数で入力ください。" }
end


※_form.html.erbのリスト

<%= 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>
    </div>
  <% end %>

  <div class="field">
      <pre><% @lunch.errors[:name].each do |msg| %>
          <br /><%= msg %>
      <% end %></pre>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
      <pre><% @lunch.errors[:star].each do |msg| %>
          <br /><%= msg %>
      <% end %></pre>
    <%= 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入門」に戻る