validates_presence_ofは一体何をしているのか?

validates_presence_of :title, :description, :url

モデルsoftware.rbに、たった一行追加するだけで未入力チェックが出来るようになった。便利なんだけど、中で一体何が起きているのか知りたい。自分なりに考えてみた。

以前の日記の追記と修正

「scaffold全体の流れから分かったこと」で書いたeditからupdateへの情報の流れを再確認を、本日、追記と修正した。validateのことを調べて行くうちに、内容の不足や勘違いしていることがあったので。今は修正後の日記になっている。

どのタイミングでチェックしているのか?

CreateボタンやEditボタンを押した後、未入力項目があればエラー表示されるので、その呼び出しメソッドから調べてみた。

コントローラ software_controller.rb
app/controllers/software_controller.rb

editからupdateへの情報の流れを再確認を見直すと、updateメソッドの3行目にデータベースを更新して、成功か失敗を判定しているところがある。

if @item.update_attributes(params[:item])

ここで、変数@itemの示すモデルSoftwareに対して、更新の依頼update_attributes(params[:item])をしている。
validates_presence_ofで指定されたフィールドが一つでも未入力であれば、失敗falseのシグナルが返ってくる。
また、モデルSoftwareは、errorsというエラー情報を保存しておく看板を持っている。
もし一つでもエラーが発生すれば、errorsという看板に、どこのフィールドで発生した、どんな内容のエラーなのかを書き込む。

render :action => 'edit'

if判定がエラーの場合は、edit.rhtmlで描画される。

ビュー edit.rhtml
app/views/edit.rhtml
<%= render :partial => 'form' %>

edit.rhtmlは、_form.rhtmlで入力フォームとその内容を描画する。

ビュー _form.rhtml
app/views/_form.rhtml
<%= error_messages_for 'item' %>

_form.rhtmlの1行目で、変数@itemが示すモデルSoftwareの看板errorsの内容表示している。

<%= text_field 'item', 'title', :size => 40  %>

また、_form.rhtmlの上記メソッドは、通常はテキストフィールドを作成するだけだが、もし看板errorsに同じフィールド名のエラー情報があったら、テキストフィールドを下記のようにタグで囲って fieldWithErrors という定義をする。

<div class="fieldWithErrors">テキストフィールド</div>
スタイルシート scaffold.css
public/stylesheets/scaffold.css

fieldWithErrorsは、スタイルシートscaffold.css(19行目)で下記のように定義されている。
そのためエラー対象の入力項目は赤枠で囲まれる。

.fieldWithErrors {
  padding: 2px;
  background-color: red;
  display: table;
}

このスタイルシートには看板errorsの表示方法も定義されている。(#errorExplanationで始まる数カ所で)

以上のような流れで、入力データの検証と表示が行われているようだ。