簡単に言えば、Rails.vimのMerb版のような感じですね。

インストールするには、

   1  % git clone git://github.com/nono/merb.vim.git

でgithubからcloneしたあと、インストール用のrakeタスクを実行すればOKです。

   1  % rake install
   2  (in /Users/takiuchi/project/merb.vim)
   3  linking ~/.vim/after/ftplugin/eruby.vim
   4  linking ~/.vim/after/ftplugin/eruby_surround.vim
   5  linking ~/.vim/after/syntax/ruby.vim
   6  linking ~/.vim/ftdetect/merb.vim
   7  linking ~/.vim/ftplugin/datamapper.vim
   8  linking ~/.vim/ftplugin/datamapper_migration.vim
   9  linking ~/.vim/ftplugin/feature.vim
  10  linking ~/.vim/ftplugin/haml.vim
  11  linking ~/.vim/ftplugin/merb_controller.vim
  12  linking ~/.vim/syntax/datamapper.vim
  13  linking ~/.vim/syntax/datamapper_migration.vim
  14  linking ~/.vim/syntax/jquery.vim
  15  linking ~/.vim/syntax/merb_controller.vim
  16  linking ~/.vim/syntax/merb_mailer.vim
  17  linking ~/.vim/syntax/merb_router.vim
  18  linking ~/.vim/syntax/merb_view.vim

posted by Png genki on Fri 21 Nov 2008 at 19:04

merbでruby-debugを使ったデバッグをする方法を紹介します。

とは言ってもRailsの時と同様に非常に簡単で、ブレークポイントを仕込みたい場所に

   1    debugger

と書いて、--debuggerオプションを指定してmerbコマンドを実行するだけです。

   1  % merb --debugger

posted by Png genki on Fri 21 Nov 2008 at 17:00

MerbでDataMapperを使っている場合にアソシエイションを記述する場合、 以下のようにhasメソッドを利用します。

   1  class User
   2    include DataMapper::Resource
   3    
   4    property :id,     Serial
   5    property :login,  String
   6  
   7    has n, :assignments
   8    has n, :groups, :through => :assignments
   9  end

第一引数はカーディナリティを指定します。nは DataMapper::Associations#nで、値はInfinityです。 1, 2, 3などの数値や、1..3, 5..n などのRangeを指定する事もできます。

上の例のように、Railsのhas_many :throughのようなこともできます。

posted by Png genki on Fri 21 Nov 2008 at 16:55

Merbではlink_toなどのヘルパーでURLを指定する時に、 urlメソッドを利用しますが、 そこで利用するNamedRouteを定義するためには、 config/router.rbの中で以下のように記述します。

   1    match('/foo').to(:controller => 'foo').name(:foo)

これをViewの中から参照する場合は、

   1  <%= link_to 'Foo', url(:foo) %>

の様になります。

posted by Png genki on Fri 21 Nov 2008 at 12:18

MerbでORMとしてDataMapperを使っている場合は、 コントローラのアクションが、以下のように仮引数でパラメータを受け取るようなデザインになっています。

   1    def show(id)
   2      @user = User.get(id)
   3      raise NotFound unless @user
   4      display @user
   5    end

このとき、Merbは、merb-action-argsというモジュールを使い、 仮引数idの名前をしらべ、Railsでいうところのparams[:id]の情報をもってきます。

merb-action-args は、以下のようにUnboundMethodの仮引数を取得します。

   1  def foo(id, bar); end
   2  method(:foo).get_args
   3  #=> [[[:id], [:bar]], []]

内部的には ruby2ruby を使っている模様。これはすごい。

See Also

posted by Png genki on Thu 20 Nov 2008 at 17:35

merb-genのサブコマンドには、resource, model, resource_controller, controllerという感じで、リソース版とそうではない版があるようなのですが、 違いが何なのかを調べてみました。

まずはmodel

   1  % merb-gen model foo
   2       (snip)
   3       [ADDED]  spec/models/foo_spec.rb
   4       [ADDED]  app/models/foo.rb

次はresource

   1  % merb-gen resource foo
   2       (snip)
   3       [ADDED]  spec/models/foo_spec.rb
   4       [ADDED]  app/models/foo.rb
   5       [ADDED]  spec/requests/foos_spec.rb
   6       [ADDED]  app/controllers/foos.rb
   7       [ADDED]  app/views/foos/index.html.erb
   8       [ADDED]  app/views/foos/show.html.erb
   9       [ADDED]  app/views/foos/edit.html.erb
  10       [ADDED]  app/views/foos/new.html.erb
  11       [ADDED]  app/helpers/foos_helper.rb

なるほど。resourceの方はRailsのscript/generate resourceのように、 コントローラやViewも作成してくれるようです。

ではcontrollerとresource_controllerの違いはなんでしょうか。 まずはcontroller

   1  % merb-gen controller foo
   2       (snip)
   3       [ADDED]  app/controllers/foo.rb
   4       [ADDED]  app/views/foo/index.html.erb
   5       [ADDED]  spec/requests/foo_spec.rb
   6       [ADDED]  app/helpers/foo_helper.rb

続いてresource_controller

   1  % merb-gen resource_controller foo
   2       (snip)
   3       [ADDED]  spec/requests/foo_spec.rb
   4       [ADDED]  app/controllers/foo.rb
   5       [ADDED]  app/views/foo/index.html.erb
   6       [ADDED]  app/views/foo/show.html.erb
   7       [ADDED]  app/views/foo/edit.html.erb
   8       [ADDED]  app/views/foo/new.html.erb
   9       [ADDED]  app/helpers/foo_helper.rb

なるほど、resourceからmodelを差し引いた感じのものが生成されるようです。 最初から入っているuserモデルのコントローラを生成するのに便利そうですね。

posted by Png genki on Thu 20 Nov 2008 at 13:06

PassengerはRackに対応しているので、Merbも動かすごとができます。

以下のように、Merbアプリケーションのディレクトリの直下に config.ruファイルを作成して置くだけです。

   1  require 'rubygems'
   2  require 'merb-core'
   3  Merb::Config.setup(:merb_root   => ".",
   4    :environment => ENV['RACK_ENV'])
   5  Merb.environment = Merb::Config[:environment]
   6  Merb.root = Merb::Config[:merb_root]
   7  Merb::BootLoader.run
   8  
   9  # Uncomment if your app is mounted at a suburi  
  10  #if prefix = ::Merb::Config[:path_prefix] 
  11  #  use Merb::Rack::PathPrefix, prefix 
  12  #end 
  13  
  14  run Merb::Rack::Application.new

ちなみに ru はRack Upの事だと思われます。

ハマった点として、 Merbアプリのひな形の"/"で表示される画面は、エラーページなので、 production環境のPassengerで動かすとエラーとして扱われてしまいます。 なので、動作確認する場合、 なにかしらコントローラを作ってから試す必要があります。

posted by Png genki on Thu 20 Nov 2008 at 12:14

いつのまにか今まで動いていたRailsアプリケーションが、以下のようなエラーを出すようになっていました。

This version of RMagick was created to run with ImageMagick 6.4.3 but ImageMagick 6.4.5 is in use

どうやら、port upgradeを行ったときにlibmagickのバージョンがあがり、 インストールされているRMagickとのバージョンの対応が崩れてしまったようです。

一度RMagickの最新バージョンをアンインストールし、 もう一度gemコマンドでインストールし直した所、解決しました。

posted by Png genki on Thu 20 Nov 2008 at 02:20

早速Merb-1.0.1にアップデートする必要がでてきたので、手順をメモしておきます。

  1. config/dependencies.rbの中で、
       1  merb_gems_version = "1.0.1"
       2  dm_gems_version   = "0.9.7"
    
  2. dm-core,dm-aggregates,dm-migrations,dm-timestamps,dm-types, dm-validations,do_sqlite3 を0.9.7にアップデート

ここまでで、とりあえず merb -iは起動するようになりました。

posted by Png genki on Wed 19 Nov 2008 at 10:08

今月16日のMerb newsで、数日後にリリースされると予定されていた Merb-1.0.1がリリースされたみたいです。

Merb news nov-16-2008

Merb 1.0.1

Merb 1.0.1 is in the work and should be released in the next few days. It’s just a maintenance release, so nothing new but we expect to ship with the new upcoming version of DataMapper, optimized generator (you will be able to use spaces in between arguments if you follow the unix standard) and some bug fixes.

インストール/アップデートはRubyGemsで行えます。

   1  % sudo gem install merb

posted by Png genki on Wed 19 Nov 2008 at 09:27