(j)Ruby on Merb : migration & merb console

前回の続きです。今回はmigrationとmerb console。

最初に前回の補足です。titleとbodyが空欄であることを避けるために、前回はmodelで



validates_present :title
validates_present :body


というように、検証しましたが、同様にmodelの



property :title, String


に、



property :title, String, :nullable => false


と追記することでも同じ検証が行えます。またさらにオプションを追記することで、範囲の設定やエラーメッセージのカスタマイズ等を行うこともできます。



property :name, String,:nullable => false,  :within => 3...40 
property :price, Float, :nullable => false, :scale => 2, :precision => 5,
:message => "価格は$0.01から、$999.99までで入力してください"


では、最初にmodelを元に、マイグレーションを行います。
Merb1.0.8.1を使っている場合は、注意が必要です。

dependecies.rbに含まれる、デフォルトで生成されるcacheストアのコードにバグがあり、そのままでは以下のように、migrationに失敗します。



  %  rake db:automigrate
(in /Sources/Merb/cache)
Loading init file from /Sources/Merb/cache/config/init.rb
Loading /Sources/Merb/cache/config/environments/development.rb
Loading init file from /Sources/Merb/cache/config/init.rb
Loading /Sources/Merb/cache/config/environments/rake.rb
rake aborted!
default store already setup
/Sources/Merb/cache/rakefile:24
(See full trace by running task with --trace)


そこで、dependecies.rbの9行目からのMerb:Cache.setupを以下のようにエディットします。



 Merb::Cache.setup do
unless defined? CACHE_SETUP
register(:default, Merb::Cache::FileStore, :dir =>
Merb.root / :tmp / :cache)
end
CACHE_SETUP = true
end
end


これで、マイグレーションが動作しますので、実行します。



rake db:automigrate


automigrateはmodel及びmigrationファイルを元に、データベースを初期化して、テーブルを作成します。


マイグレーションが完了したら、一度merbを起動してみます。アプリケーションルートで



merb


と入力すると、開発用サーバが起動するので、http://localhost:4000/articles にアクセスしてみてください。デフォルトのview


が表示されていればここまでは問題なく進んでいます。viewはRailsと同様に、/app/views/articles/xxx.html.erbがテンプレートとして呼び出されます。またアプリケーション全体のテンプレートは/app/views/layout/application.hmtl.erbと、これもRailsと同様です。


ここで、Railsのscript/consoleにあたるmerb -iを使ってみたいと思います。このmerb -iを使うにはmongrelが必須となりますので、インストールされていない場合は、インストールしておいてください。

まず起動します。アプリケーションルートで



   merb -i


そうすると、



Loading init file from /Sources/Merb/blog/config/init.rb
Loading /Sources/Merb/blog/config/environments/development.rb
~ Connecting to database...
~ Loaded slice 'MerbAuthSlicePassword' ...
~ Parent pid: 1547
~ Compiling routes...
~ Activating slice 'MerbAuthSlicePassword' ...
irb: warn: can't alias context from irb_context.
>>


というようなダイアログが表示されます。そこでレコードを加えて見たいと思います。



>> Article.count
~ (0.000115) SELECT COUNT(\*) FROM "articles"
=> 0
>> Article.create(:title => 'test',:body => 'this is a test post.')
~ (0.002843) INSERT INTO "articles" ("updated_at", "body", "title", "created_at") VALUES ('2009-01-23T15:07:40+09:00', 'this is a test post.', 'test', '2009-01-23T15:07:40+09:00')
=> #
body="this is a test post." title="test" created_at=#>
>> Article.count
~ (0.000075) SELECT COUNT(\*) FROM "articles"
=> 1


このように、Rails consoleと全く同じように使う事ができます。Merb Consoleの特徴的な機能として、サンドボックス機能があります。

この機能は、現在開発中のため、まだ正常に動作しませんが、サンドボックス内で行った作業がサンドボックスを終了するとロールバックされるというものです。
便利なので、早期の実装が待たれるところです。


現状ではどのように、動作するかみてみます。



>> Article.count
~ (0.000094) SELECT COUNT(\*) FROM "articles"
=> 1
>> merb.open_sandbox!
Loading development environment in sandbox (Merb 1.0.8.1)
Any modifications you make will be rolled back on exit
=> [Merb::Orms::DataMapper]
>> Article.all.destroy!
~ (0.002382) DELETE FROM "articles"
=> false
>> Article.count
~ (0.000076) SELECT COUNT(\*) FROM "articles"
=> 0
>> merb.close_sandbox!
Modifications have been rolled back
=> nil
>> Article.count
~ (0.000088) SELECT COUNT(\*) FROM "articles"
=> 0
>>


このように残念ながらロールバックはされません。


ということで、今回はここまで

投稿されたコメント:

コメント
  • 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
   
       
今日