1

sinatra アプリケーションから拡張機能に機能を抽出しています。私の拡張モジュール ( ExtensionBar) は、別の拡張モジュール ( ) によって作成されたクラスレベルの DSL 拡張機能の存在に依存していますExtensionFoo。このため、私の拡張機能はrequire、メイン アプリで d を実行すると停止します。

my_app.rb:

require "extension_foo"
require "extension_bar"    

class MyApp < Sinatra::Base
  register ExtensionFoo
  register ExtensionBar
end

extension_foo.rb:

module ExtensionFoo
  def with_foo
    yield
  end
end

extension_bar.rb:

module ExtensionBar
  with_foo do
    "bar"
  end
end

私の質問: 別の拡張機能のレジストリに依存する拡張機能を最も堅牢かつ簡単に作成するにはどうすればよいですか? メタプログラミングはできるだけ避けたい。

4

1 に答える 1

0

あなたが与えた例では、 ExtensionBar はどのアプリにも何もしません。また、アプリで使用する拡張機能に依存する拡張機能を登録する必要があります。モジュールの作成に関する指示では、 LinkBlocker beforeDSL の例としてブロックが示されています。どちらも例を次のようにします。

# extension_foo.rb

require 'sinatra/base'

module Sinatra
  module ExtensionFoo
    def with_foo
      warn "Calling with_foo"
      s = yield
      warn "s = #{s}"
      s
    end
  end
  register ExtensionFoo
end


# extension_bar.rb

require 'sinatra/base'
require_relative 'extension_foo.rb'

module Sinatra
  module ExtensionBar
    before do
      warn "Calling with_foo in before"
      with_foo do
        "bar"
      end
    end
  end
  register ExtensionBar
end


# app.rb

require 'sinatra'
require_relative 'extension_bar.rb'

get "/" do
  with_foo do
    "blah"
  end.inspect
end

これを実行してもエラーは発生せず、STDOUT に警告が表示されますが、出力は「何とか」です。

Calling with_foo in before
Calling with_foo
    from /Volumes/RubyProjects/Test/extension_dependency/extension_foo.rb:6:in `with_foo'
s = bar
    from /Volumes/RubyProjects/Test/extension_dependency/extension_foo.rb:8:in `with_foo'
Calling with_foo
    from /Volumes/RubyProjects/Test/extension_dependency/extension_foo.rb:6:in `with_foo'
s = blah
    from /Volumes/RubyProjects/Test/extension_dependency/extension_foo.rb:8:in `with_foo'
于 2013-01-04T17:34:19.650 に答える