(j)ruby on Merb : create resource and validator
前回の記事に追記したように、DataObjectsがJRubyで現在のところ、満足に動作しませんが、もうすぐサポートしたものが正式にリリースされるようなので、JRubyではなく、MRIをつかってMerb+Datamapperで遊んでいきたいと思います。
ちなみにソース(そんな大げさなものではないですが)は、githubで公開しています。
まず前回作ったアプリのディレクトリに移動し、config/dependencies.rbのdatamapperのバージョンを書き換えます。
dependencies.rbの
dm_gems_version = "0.9.8"
を
dm_gems_version = "0.9.9"
に変更します。Merbアプリケーションが起動する際に、最初にロードされる設定ファイル(正確にはinit.rbがロードされますが、init.rbの冒頭でdependencies.rbが呼ばれているため)で、アプリケーションが依存するMerb関連のgemをバージョンとともに定義したものです。
ここに定義されているgemは、機能としてはいわゆるgemというより、Merbのプラグイン的なものととらえる方が良いのかもしれません。
dependencies.rbがロードしおわると、init.rbの続きがロードされます。このinit.rbには、
use_orm :datamapper
use_test :rspec
use_template_engine :erb
というように、このMerbアプリケーションで使用する、ORM、テストフレームワーク、テンプレートエンジンが記載されており、これを変更することでもそれぞれのコンポーネントを変更することができます。もちろん変更した場合は、dependencyの宣言も変わってきます。
例えば、datamapperのかわりに、activerecordを使う場合は、
use_orm :activerecord
となり、dependency部分は、dm-xxxの部分はすべて削除し、merb_datamapperのかわりに、
dependency "merb_activerecord"
という感じになります。
では、続きです。RailsのScaffoldに相当するのが、Resourceです。resourceを生成することにより、model, controller, デフォルトのviewが自動生成されます。Stringのtitleと、TextのBoby,Datetimeのcreated_at,updated_atを作成します
merb-gen resource article title:string,body:text,create_at:datetime,updated_at:datetime
実行すると、model,controller,view以外にconfig/router.rbに
resources :articles
というルーティングが追加されます。
ここで、生成された article modelファイルを確認します。
class Article
include DataMapper::Resourceproperty :id, Serial
property :create_at, DateTime
property :updated_at, DateTime
property :body, Text
property :title, Stringend
このように、Railsというかactiverecordでは、スキーマの定義をmigrationファイルで行いましたが、datamapperではmodelファイルに直接記述します。
ちなみにMerb+activerecordの場合は、schema/migration/番号_resourcename_migration.rbというマイグレーションファイルが生成され、これを元にRailsと同様にmigrateすることになります。
つぎにtitleとbodyが空欄であることをさけるため、validateしたいと思います。datamapperでのvalidateは、modelに
validates_present :title
validates_present :body
というように書きます。もちろんvalidates_present以外にもさまざまなvalidatorが用意されています。
#入力されていないことの検証
validates_absent :spam# zip_codeが7桁であることの検証
validates_length :zip_code, :is => 7# ageが3桁以内であることの検証
validates_length :age, :in => 1..3# passwordとpassword_confirmationが同一であることの検証
validates_is_confirmed :password# passwordとpassword_repeatが同一であることの検証
validates_is_confirmed :password, :confirm => :password_repeat# registrationが正規表現にマッチしていることの検証
validates_format :registration, :with => /[A-Z]{3}-[0-9]{3}/# emailがメールアドレスであることの検証
validates_format :email, :as => :email_address# homepageがurlであることの検証
validates_format :homepage, :as => :url# ageがintegerであることの検証
validates_is_number :age, :integer_only => true# percentageが数字であることの検証
validates_is_number :percentage# emailが一意であることの検証
validates_is_unique :email
さらに独自にvalidatorを定義することももちろん可能で、たとえばpriceが正の値であることを検証したい場合は、
validates_with_method :price, :positive_price?
def positive_price?
if @price <= 0.0
[false, "価格には正の値を入力してください"]
else
true
end
end
というようにカスタムメソッドを設定してやると、独自のvalidatorをつくることができます。
長くなってきたので、ほとんどコーディングしてませんが、今回はここで終了です。
最後に、今回の作業をMerb+activerecordで行ったものも参考になるか分かりませんが、githubに置いておきました。
2009/01/16 by Tomo Nozawa
« jruby on Merb :... | メイン | merb 1.0.8.1 release »