目的
単にバリデーションの機能が欲しいという場合でも、バリデーション単体で機能を提供してくれるモジュールがなかなか見つかりません。
たいていはデータベースアクセスとセットで、データベースへのレコード追加/更新前のタイミングでのバリデーション機能になっています。
そこで目をつけたのが DataMapper です。
DataMapper のバリデーション機能は、dm-validations モジュールとして独立しているため単独*1で使えます。
dm-validations モジュールのみを使ってバリデーションを行うためのポイントを抑えることを目的とします。
データベースに依存しないため、データベース依存のネイティブコードも全く不要で簡単にバリデーションを実現できます。
サンプル
example.rb
require 'dm-validations' class Person include DataMapper::Resource property :name, String, :required => true property :email, String, :format => :email_address end person = Person.new person.name = ARGV[0] person.email = ARGV[1] if person.valid? then puts "Valid" puts "name : #{person.name}" puts "email: #{person.email}" else puts "Invalid" errors = person.errors errors.keys.each do |property_name| puts "* #{property_name}: #{errors[property_name]}" end end
解説
とりあえず動かす
サンプルを動かすにはまず以下のコマンドを実行して dm-validations gem をインストールしてください。
gem install dm-validations
インストールが完了したらサンプルを動かします。サンプルを動かすには、以下のコマンドを実行してください。
ruby example.rb taro taro@ownway.info
example.rb のコマンドライン引き数の意味は以下の通りです。
順番 | 説明 |
1 | 名前を指定します。必須です。 |
2 | メールアドレスを指定します。任意です。 |
結果は以下のようになります。
Valid
バリデーション上、問題は無かったということです。
以下にいくつかの実行結果を示します。
ruby example.rb taro Valid ruby example.rb taro tarotaro Invalid * email: ["Email has an invalid format"] ruby example.rb Invalid * name: ["Name must not be blank"]
メールアドレスの形式が不正だったり、名前が無かったりするとバリデーションで問題が発見され、その旨のメッセージが出力されます。
バリデーションの定義
バリデーションの内容は、独自のクラスを定義して行います。クラス名は任意です。
ルールは以下の通りです。
- include DataMapper::Resource する。
- property キーワードを使って属性を定義する。
property の引き数は以下の通りです。
順番 | 説明 |
1 | 属性名 |
2 | 属性の型 |
3 以降 | バリデーションの定義(複数指定可) |
定義したクラスは普通と同様、new によってインスタンスを生成できます。
property で定義した属性は「インスタンス.属性名」で値の取得/代入できます。
バリデーションの実施
バリデーションを実施するには、valid? メソッドを呼び出します。
このメソッドを呼び出した時点でバリデーションが実施されます。バリデーションに問題が無ければ true、それ以外の場合は false が返ってきます。
valid? メソッド呼び出し時にバリデーションの問題が検出された場合、errors メソッドによって
- 問題があった項目の名前
- errors.keys
- 戻り値は項目名の配列。
- 項目ごとのメッセージ
- errors[項目名]
- 戻り値はメッセージの配列(複数のバリデーションで問題が検出されている可能性があるため)。
を取得できます。
サンプルでは errors.keys.each により、問題があった全ての項目のメッセージを出力しています。
補足
標準のコンストラクタを使ってはいけない
DataMapper::Resource には標準のデフォルトコンストラクタがあります。
それを使うと以下のようにインスタンスを生成できます。
person = Person.new(:name => 'taro', :email => 'taro@ownway.info')
しかし、DataMapper を dm-validations 単体で使う場合、これを使うことは推奨しません。
この機能を有効にするにはクラスを定義した後、DataMapper::finalize を呼び出す必要があります。
これはクラスをデータベースのモデルとして検証し、妥当であることを確認するメソッドです。
データベースと全く関連の無いモデルを検証のみの目的で定義しているためこのメソッドは実行できません*2。
コンストラクタの定義
デフォルトのコンストラクタは使えませんが、独自のコンストラクタの定義はできます。
以下、事例です。
class Person include DataMapper::Resource def initialize(name, email) @name = name @email = email end property :name, String, :required => true property :email, String, :format => :email_address end
これ以上の詳細
メインサイトの Validations のページを参照してください(※ 英語)。
基本的に提供してくれるバリデーションの情報やカスタムバリデーションの作り方が書いてあります。
コメント
本ページの内容に関して何かコメントがある方は、以下に記入してください。
コメントはありません。 コメント/data_mapper/use/validations/only