最上位のコードは に委任されるSinatra::Application
ため、これは従来のアプリケーションを実行するためのシナリオになります。
# app.rb
require 'sinatra'
get '/' do
'hi'
end
# config.ru
require './app'
run Sinatra::Application
モジュラー アプリを定義する場合は、次のように実行します。
# app.rb
require 'sinatra/base'
class Kincalc < Sinatra::Base
get '/' do
'hi'
end
end
# config.ru
require './app'
run Kincalc
今、あなたがやろうとしていることはこれだと思います:
# otherfilename.rb
require 'sinatra'
get '/' do
'hi'
end
# app.rb
require 'sinatra/base'
class Kincalc < Sinatra::Base
require './otherfilename'
end
# config.ru
require './app'
run Kincalc # Sinatra::Application seems to work
あなたが経験する動作 (404 File Not Found を取得する) は実際には正しく、require
それが呼び出されたレキシカル スコープを気にしません。次の例を確認してください。
# a.rb
puts "in a, top level: #{self.inspect}"
module Example
puts "in a, nested: #{self.inspect}"
require 'b'
end
# b.rb
puts "in b: #{self.inspect}"
結果の出力は次のようになります。
in a, top level: main
in a, nested: Example
in b: main
したがって、1 つのモジュラー アプリケーションを使用する場合は、次のようにする必要があります。
# otherfilename.rb
Kincalc.get '/' do
'hi'
end
または、クラスを再度開きます。
# otherfilename.rb
class Kincalc
get '/' do
'hi'
end
end
または、実際にそのotherfilename.rb
定義を作成してSinatra::Application
、で使用することもできますKincalc
。
# app.rb
require 'sinatra/base'
require './otherfilename'
class Kincalc < Sinatra::Base
use Sinatra::Application
end
または、最上位の DSL メソッドが委任される場所を変更できます。
# app.rb
require 'sinatra/base'
class Kincalc < Sinatra::Base
Sinatra::Delegator.target = self
require './otherfilename'
end