(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::Resource

property :id, Serial

property :create_at, DateTime
property :updated_at, DateTime
property :body, Text
property :title, String

end




このように、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に置いておきました。

投稿されたコメント:

コメント
  • HTML文法 不許可
About

Tomo

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日