merb-auth-slice-passwordは、merb-gen appがデフォルトで生成する認証機能ですが、これを使ってログインが必要なアクションを作ると、デフォルトのrequest specでエラーが出るようになります。

そのような場合には、spec_helper.rbの中で、 以下のようなヘルパーを用意すると良いようです。

   1  Merb::Test.add_helpers do
   2    def create_default_user
   3      unless User.first(:login => "krusty")
   4        User.create( :login => "krusty",
   5                     :password => "klown",
   6                     :password_confirmation => "klown") or raise "can't create user"
   7      end
   8    end
   9  
  10    def login
  11      create_default_user
  12      request("/login", {
  13        :method => "PUT",
  14        :params => {
  15          :login => "krusty",
  16          :password => "klown"
  17        }
  18      })
  19    end
  20  end

See Also

posted by Png genki on Wed 14 Jan 2009 at 11:08

MerbのGeneratorは、merb-genというコマンドに集約されています。 Railsではscript/{generate|destroy}を使いますが、独立したコマンドになっているので、 MERB_ROOT以外の場所でも利用可能です。

さて、Merbでも、RailsのようにGeneratorを独自に作る事が出来るのですが、 そのためにはGEM_ROOTにGeneratorsというファイルを作り、 以下のように自分をGeneratorとして登録するコードを書きます。

   1  scope 'merb-gen' do
   2    dir = File.join(File.dirname(__FILE__), 'lib', 'generators/')
   3    Merb.add_generators dir + 'mailer_generator'
   4  end

MerbのGeneratorは、より汎用的なGeneratorを作る仕組みである、 templater を使って実装されています。 そのため、Merb用のGeneratorを作る場合は、上記ファイルのscopeに merb-genを指定する必要があります。

Railsの場合は、foo_generater のようにGem名のサフィックスでGenerator を提供するかどうか判別していましたが、 こっちのほうがもっと賢いやり方だと思います。

posted by Png genki on Tue 13 Jan 2009 at 23:30

$EDITORで~/.zshrcを開いて

   1  alias mi='PATH=./bin:$PATH merb -i'
   2  alias mg='PATH=./bin:$PATH merb-gen'

の2行を追加すると、 thor merb:gems:install環境でもそうじゃない環境でも、所望のコマンドが実行されて便利です。

posted by Png genki on Tue 13 Jan 2009 at 17:26

Merbをコンソールから操作する時には、merb -iコマンドを実行するのですが、 アプリケーションコードの変更を検出すると、自動的にirbがリロードされてしまい、ヒストリーが消えてしまうので、若干不便さを感じていました。

そんな時は、 irb-history があなたのMerbライフを強力にサポートしてくれます(Thanks maiha!)

まずはおもむろに

   1  % sudo gem install irb-history

つづいて、~/.irbrc に以下の行を追加します。

   1  require 'rubygems'
   2  require 'irb/history'
   3  IRB::History.start_client

これでOK。あとは普通にmerb -iを使っていれば、リロードされても ヒストリーが消えません。

posted by Png genki on Tue 13 Jan 2009 at 16:58

Railsでいう所のrecognize_pathに相当する事をMerbでやる場合、 以下のようにすると良いようです。

   1  Merb::Router.match(Merb::Request.new('REQUEST_PATH' => "/", 'REQUEST_METHOD' => 'GET'))
   2  #=> [29, {:action=>"index", :controller=>"top"}]

必要に応じて'QUERY_STRING'なども追加します。

posted by Png genki on Tue 13 Jan 2009 at 01:52

多分この週末がすぎれば直ってると思うんですが、GitHubのgem生成機能が動作していないようで、公開したいgemが公開されずに困っています。 そういう場合に、手動でなんとかする方法をメモ。

GitHubで公開されているgemは、GEM_NAMEにユーザIDがプレフィックスとしてつくので、単純にgitをcloneしてきてrake installしても、プレフィックスがついていないgemがインストールされてしまうので、ちょっと困ります。

この問題を回避するには、自分でgemspecファイルを編集して、 以下のようにプレフィックスをつけてやる必要があります。

   1  # -*- encoding: utf-8 -*-
   2  
   3  Gem::Specification.new do |s|
   4    s.name = %q{genki-merb_babel}
   5    s.version = "0.1.0.6"

gemspecファイルを編集したら、

   1  % gem build merb_babel.gemspec
   2  % sudo gem install genki-merb_babel-0.1.0.6.gem

という感じでインストールすれば、GitHubからインストールしたのと同じような感じでインストールできます。

posted by Png genki on Mon 12 Jan 2009 at 11:12

参加者の皆様、お疲れさまでした。 簡単に今日のまとめを書いておきます。

MerbのI18n, L10nについて

  • merb_babelを使おう(Mattetti氏作)
  • Merb.root/lang以下にen.ymlのような物を作る。中身は以下のような感じ
       1  mloc_language_code: en
       2  Color: Color
    
    もう一個 en-UK.yml とかも作ってみる。
       1  mloc_language_code: en
       2  mloc_country_code: UK
       3  Color: Colour
    
    mloc_language_codeの指定は必須になります。
  • 実際にローカライズする場合は、ControllerやViewから、以下のように呼び出します。
       1  <%= translate(:Color) %>
       2  <%= t(:Color) %>
       3  <%= _(:Color) %>
    
    バージョン0.1.0.2では第一引数はシンボルである必要がありますが、 現時点での最新バージョンである0.1.0.6では文字列で指定可能です。

sliceについて

  • sliceの立ち位置を確認
    • SophisticatedなRails Engines.
  • ソースコードを追いかけながらsliceの挙動を色々と調査した。
    • Merb::BootLoaderの仕組みなど
  • merb-auth-slice-passwordを例に色々調べた
  • merb_adminを作ってみた
    • config/router.rbにadd_slice(:merb_admin)
  • sliceからrouterを自動的に登録する方法を調査したがわからず。宿題。

懇親会

Rails勉強会で一時期多用していたサクラ水産に匹敵する安さの店(テング酒場)で懇親会。

posted by Png genki on Mon 12 Jan 2009 at 04:12

DataMapperのResourceの派生クラスを列挙するには、以下のようにします。

   1  DataMapper::Resource.descendants
   2  => #<Set: {User, Event, Merb::DataMapperSessionStore, Comment}>

簡単ですね。

posted by Png genki on Sun 11 Jan 2009 at 16:55 with 1 comment

Merbでは、providesによってMIMEタイプに応じたレスポンスを返す仕組みがありますが、 :htmlや:yamlや :jsなどの、あらかじめ登録されてあるMIMEタイプ以外のコンテンツを返したい場合には、以下のようにMIMEタイプを定義する必要があります。

config/init.rb

   1  Merb.add_mime_type(:pdf, :to_pdf, %w[application/pdf], "Content-Encoding" => "gzip")

あとは、コントローラの中で provides :pdfを宣言し、 render @objすれば、@obj.to_pdfが呼ばれる感じになります。

See Also

posted by Png genki on Fri 9 Jan 2009 at 10:29

株式会社万葉 さまより会場提供を頂きまして、 下記の日程でMerb勉強会を開催いたします。

  • 日時 / DATE : 2009/01/11 12:00 to 18:00
  • 定員 / LIMIT : 11 人
  • 場所 / PLACE : 株式会社万葉 神保町オフィス http://everyleaf.com/company/
  • 参加費 / FEE : 飲食代(過去の実績では500〜1000円程度。参加人数によって異なります)

内容

  • sliceを極める
  • Rails3の行く末を案じる
  • Merbお悩み相談
  • 各自ネタを持ち寄って披露する

お昼時なので、ピザと飲み物を用意いたします。 参加をご希望の方は、以下のページより参加登録をお願いいたします。

それでは、よろしくお願いいたします。

posted by Png genki on Fri 9 Jan 2009 at 10:02