3rdRailによるRailsプログラミング入門

第2回 ActiveRecordが提供するModel機能を理解しよう

富田 陽介
Banana Systems株式会社

2009/4/24

バリデーションの動作確認

- PR -

 ActiveRecordが提供するバリデーション機能を見ていきましょう。

 ActiveRecord::Baseを継承して作成されたModelクラスでは、クラス中でvaridates_*という名前のクラスメソッドにより、インスタンス属性値が適合しているべき検証条件を定義できます。

 前回作成したHitokotoモデルでは、すでに1件のバリデーション条件が定義されています。ソースコード(hitokoto.rb)を確認してみましょう。[Railsエクスプローラー]ビューの[モデル]にあるHitokotoをダブルクリックして、編集エリアにhitokoto.rbを表示します。

hitokoto.rb
hitokoto.rb

 ここで使用されているクラスメソッドvalidates_presence_ofでは、引数として渡された名前の属性値が存在していること(blankでないこと)を定義しています。従って、この例ではHitokotoインスタンスは、hitokotoという名前の属性値が存在することを必須条件としています。

 ここで、3rdRailのRubyドキュメンテーション参照機能を使用して、validates_presence_ofのドキュメントも確認してみましょう。validates_presence_ofにカーソルを合わせ、ウィンドウ下部の[Rubyドキュメンテーション]タブをクリックすると、以下のようにActiveRecordソースコード中で記述されているコメントをリファレンスドキュメントとして参照できます。

Rubyドキュメンテーション(画像をクリックすると拡大します)
Rubyドキュメンテーション

 さて、上記で設定されているバリデーション動作を確認するために、先ほどと同様にRailsコンソールを使ってバリデーションを実行してみましょう。以下のメソッドにより、hitokoto属性値のないHitokotoインスタンスを作成し、検証してみます。

>> h = Hitokoto.new
=> #<Hitokoto id: nil, hitokoto: nil, created_at: nil, updated_at: nil>
>> h.valid?
=> false
>> h.hitokoto = "Hello, ActiveRecord!"
=> "Hello, ActiveRecord!"
>> h.valid?
=> true

 ここで使用したメソッドvalid?は、ActiveRecord#Baseで定義されているものです。このメソッドを、上記のように作成したインスタンスに対して使用すると、バリデーション条件への適合状態が論理値で返されます。

 なお、デフォルトではデータベースへの保存や更新を行う際も、上記のバリデーションが自動実行されます。以下で使用しているsaveメソッドはデータベースへの保存を行うためのメソッドですが、falseが返され、レコード保存に失敗している(正しく検証できている)ことが確認できます。

>> h = Hitokoto.new # Hitokotoインスタンスを作成し直す
=> #<Hitokoto id: nil, hitokoto: nil, created_at: nil, updated_at: nil>
>> h.save
=> false
>> h.hitokoto = "Hello, ActiveRecord!"
=> "Hello, ActiveRecord!"
>> h.save
=> true

 それでは、hitokoto属性値への検証条件を追加してみましょう。hitokoto.rbを編集し、バリデーションを追加してみます。

 ここで、3rdRailが提供するコード補完候補機能を使ってみます。エディタ中で以下のようにvalidates_と入力したところで^+Space(Ctrlキーを押しながらスペースキー)を押してみましょう(^+Spaceは、Mac OS XのSpotlightへのショートカットが設定されている場合がありますので、必要に応じてキーバインドを変更してください)。

コード補完候補機能(画像をクリックすると拡大します)
コード補完候補機能

 validates_length_ofメソッドを追加したいので、さらにlキー(小文字のエル)を押し候補を絞り込みます。validates_length_ofが選択されていることを確認したら、returnキーを押せばコード補完が完了します。

 このように3rdRailでは、コード補完に^+Spaceを使用します。補完はメソッド名だけではなく、メソッドの引数や変数名の入力時にも有効です。定義済みのメソッドを素早く入力する際はもちろんですが、メソッドへの引数が思い出せないときなどに、とりあえず^+Spaceを押してみると、コーディングをスムーズに進めるための助けになるでしょう。

 さて、ここでは、以下のようにvalidates_length_ofメソッドへの引数を設定します。

class Hitokoto < ActiveRecord::Base

  validates_presence_of :hitokoto
  validates_length_of :hitokoto, :maximum => 5

end

 上記の例では、hitokoto属性値の文字列長の最大値が5であることを設定しています。Railsコンソールで再度確認してみましょう。

 ソースコードを編集した後にRailsコンソールでの動作確認を行う場合は、コンソールの再起動が必要です。3rdRailのメニューから[ウィンドウ]−[Railsコンソール]の順にクリックし、[新規作成]から新しいRailsコンソールを起動してください。

 起動したコンソールで、以下のメソッドにより追加したバリデーション機能の動作を確認してみます(実は、Railsコンソールなどのコンソールウィンドウでも、上記のコード補完機能は有効です。適当な個所で^+Spaceを試してみてください)。

>> h = Hitokoto.new
=> #<Hitokoto id: nil, hitokoto: nil, created_at: nil, updated_at: nil>
>> h.hitokoto = "Hello, ActiveRecord!"
=> "Hello, ActiveRecord!"
>> h.valid?
=> false
>> h.hitokoto = "Hello"
=> "Hello"
>> h.valid?
=> true

 "Hello, ActiveRecord!"は文字列長が大きすぎるため、valid?に失敗していることが確認できました。

 ActiveRecordのバリデーション機能では、ここで紹介したもの以外にも、文字列フォーマット条件や、検証を行う前提条件を与えることで、さまざまな検証条件を定義できます。詳しくはマニュアルや書籍などを参照してください。

prev
2/3
next

Index
ActiveRecordが提供するModel機能を理解しよう
  Page1
ActiveRecordが提供するModel機能
ファインダの動作確認
Page2
バリデーションの動作確認
  Page3
アソシエーション
マイグレーション

index 3rdRailによるRailsプログラミング入門

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Coding Edge 記事ランキング

本日 月間