バリデーションによる値の検証 (4/5)
作成:2012-10-28 19:05
更新: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つ考えたいのは、「まとめて表示するのではなくて、各フィールドごとにメッセージを表示したい」ということでしょう。
これは、ビューテンプレートを修正することで対応できます。下のリスト欄に修正リストを掲載しておきました。とりあえず、ここではnameとstarにだけ、メッセージ表示の処理を用意しておきました。
例として、nameのエラー表示の処理部分を見てみましょう。このようになっていることがわかりますね。
注意したいのは、このエラーメッセージもやはり配列である、という点です。1つのコラムに複数のバリデーションを設定する場合もありますから、2つのコラムに複数のエラーが発生することもあるためです。
下のリスト欄に、修正したモデルのスクリプト(lunch.rb)のリストを掲載しておきました。日本語を使う場合、冒頭に「# coding: utf-8」をつけてエンコードを明示的にUTF-8に指定するのを忘れないでください。
ここでは、それぞれのバリデーション部分に「:message => ○○」といったオプションが用意されています。これが、エラーメッセージを指定するためのものです。
numericalityの場合は、値として用意されているハッシュに:message => ○○といった項目を追加するだけですみます。が、presenceの場合は、値がtrueですね。こうしたものは、trueの代りにハッシュを値として用意し、その中にmessageを用意します。要するに、「必要なオプションが全く無ければtrueだけでいいが、1つでもあるならハッシュにする」というわけです。
■それぞれのフィールドにエラーメッセージを表示するには?
エラーメッセージについてもう1つ考えたいのは、「まとめて表示するのではなくて、各フィールドごとにメッセージを表示したい」ということでしょう。
これは、ビューテンプレートを修正することで対応できます。下のリスト欄に修正リストを掲載しておきました。とりあえず、ここではnameとstarにだけ、メッセージ表示の処理を用意しておきました。
例として、nameのエラー表示の処理部分を見てみましょう。このようになっていることがわかりますね。
<% @lunch.errors[:name].each do |msg| %>@lunch.errors[:name]というようにしてエラーメッセージの情報を取得しています。errorsのオブジェクトは、full_messagesの他にもメッセージを取得するための仕組みがあるのです。errors[:コラム]というようにコラム名を指定することで、そのコラムで発生したエラーメッセージだけを取り出すことができます。
<br /><%= msg %>
<% end %>
注意したいのは、このエラーメッセージもやはり配列である、という点です。1つのコラムに複数のバリデーションを設定する場合もありますから、2つのコラムに複数のエラーが発生することもあるためです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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 %>
※関連コンテンツ