値の検証(バリデーション)
ActiveRecordを使うと、データ保存時の値の検証(バリデーション)もメソッドを用いて簡単に実装できます。
前節で紹介したsaveメソッドで保存に失敗するのは、主にこのバリデーションで正しい値でないと判断された場合に起こります。Userモデルのバリデーションを見てみましょう。
38 |
validates_presence_of :name, :message => 'は必須です' |
app/models/user.rb |
Userモデルにおけるバリデーションには、例えば「名前(name)は必須、かつ、60けた以上の値を入れてはいけない」というものがあります。それを表現したのが、38行目、39行目になります。このように、validates_xxx_ofという形で、モデルの中に記述することで簡単にバリデーション処理を実現することができます。
必須チェック、けた数チェックのほかにも、あらかじめ一般的な検証メソッドがいくつも用意されているので、それらを使い1行で表現することができます。
こうしたバリデーションは、saveメソッドの実行時に判定されます。もしもバリデーションに引っ掛かるような値が設定された状態でsaveメソッドが呼ばれた場合は、保存に失敗したうえで、バリデーションのエラーの内容が、保存しようとしたオブジェクトの中に格納されて返されます。コントローラ側でそれを受けて、以下のようなバリデーションエラー画面を出すことが多いです。
図4 バリデーションエラー |
コールバック
バリデーションの処理は、Railsフレームワークが保存時に自動的に行ってくれます。しかし、保存処理などの任意のタイミングで、自分で記述した処理を実行させたい場合もあると思います。そういったニーズに応えるのが、コールバックと呼ばれる機能です。
実際にSKIPで使っている個所を紹介しましょう。SKIPのUsersテーブルにあるsectionというカラムがあり、そこにはユーザーの所属する部署の値が入ります。その値は自由入力形式で登録することができるため、大文字・小文字、全角・半角などの入力のぶれが発生し、検索時にうまくヒットさせることができない場合が出てきます。
そこで、SKIPではコールバック機能を使い、保存前に入力のぶれを統一する処理を入れています。以下がその部分のソースコードです。
95 |
def before_validation |
95行目のbefore_validationというのが、コールバックの宣言文になっています。before_validationは、名前のとおりバリデーション処理の直前にRailsフレームワークから呼び出されて実行されます。
96行目では、ユーザーの入力した大文字・小文字、全角・半角のぶれを統一する処理を記述していますが、この部分が、バリデーション前に実行されるのです。
また、99行目のbefore_saveも同じコールバックの処理になりますが、呼び出されるタイミングがバリデーション後になります。この処理はユーザーのパスワードを暗号化している処理で、コールバックを使うことで、いろいろな個所で行うのでなく1カ所で記述できるようになっています。
ほかにも、“before_xxx”や“after_xxx”という形で、いろいろなタイミングで呼び戻されるようなコールバックの仕組みが用意されています。
ちなみに、コールバックを使うことで最初に思い付くのは、データベースへの更新日時を記録することだと思います。これについては、非常によく行われるということで、ActiveRecordの基本機能として最初から実装されています。
その使い方は、保存したいテーブルに、update_atというカラム名を定義しておくというものです。これで、データの更新が掛かった際に、自動的にそのタイミングの時刻が保存されるようになります。ほかにもcreate_atなどがあります。
3/4 |
Index | |
ActiveRecordを使ったソースコードを読もう | |
Page1 SKIPバージョン1.0リリース! MVCモデルのM |
|
Page2 データの検索 データの更新 |
|
Page3 値の検証(バリデーション) コールバック |
|
Page4 テーブルの関連 トランザクション |
Railsコードリーディング 〜scaffoldのその先へ〜 |
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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|