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
Contents
Merbの黒魔術 merb-action-args
merb-genのresourceは何をしてくれるのか
MerbをPassenger (aka mod_rails)で動かす
"ImageMagick 6.4.3 but ImageMagick 6.4.5 is in use"の対処法
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ