コードが重複し始めている config.ru ファイルがあります。
map '/route1' do
run SampleApp.new
end
map '/route2' do
run SampleApp.new
end
このconfig.ruファイルを独自のRackアプリケーションに変えたいので、私がしなければならないことは次のとおりです。
map '/' do
run MyApp.new
end
独自の Rack アプリケーションを作成する正しい方法は何ですか? 具体的には、map
クラス内でメソッドを使用して一連のルートを定義できるように、クラスを作成するにはどうすればよいですか?
解決:
これが実用的な解決策です:
class MyApp
def initialize
@app = Rack::Builder.new do
# copy contents of your config.ru into this block
map '/route1' do
run SampleApp.new
end
map '/route2' do
run SampleApp.new
end
end
end
def call(env)
@app.call(env)
end
end
map
以前にこれを試しましたが、インスタンス変数をブロックに渡そうとしていたため、機能しませんでした。例えば:
def initialize
@sample_app = SampleApp.new
@app = Rack::Builder.new do
map '/route1' do
run @sample_app # will not work
end
end
end
これが機能しない理由は、渡されるブロックがインスタンスのコンテキストで評価されるためmap
です。Rack::Builder
ただし、ローカル変数を渡すと機能します。
def initialize
sample_app = SampleApp.new
@app = Rack::Builder.new do
map '/route1' do
run sample_app # will work
end
end
end