1

私は、SinatraアプリをHerokuにデプロイすることについて、実際には実際的な問題ではなく、単なる概念上の難問であることに戸惑っています。

私は2つのアプリを持っていますが、ほとんどすべての点で同じですが、1つは、Sinatra :: Baseクラスを含まないファイルにロジックのほとんどを配置し、「requireotherfilename」を使用して必要なロジックを取得します。そのSinatra:Baseクラスの名前はKincalcです。

すべてのロジックが1つのファイル(つまり、Sinatra:Baseクラスを含む同じファイル)に含まれているアプリの場合、config.ruファイルの最後の行に「runSinatra :: Application」と表示され、正常に起動します。しかし、他のアプリでは、それを最後の行に含めると、アプリは正しくアップロードされ、「Herokuにデプロイされました」と表示されますが、「見つかりません」というメッセージが表示されます。最後の行に「runKincalc」と表示すると、正常に読み込まれます。

私はこれを前後にチェックしましたが、ロジックに2番目のファイル(これもルートにあります)を使用するという事実を除いて、これら2つのアプリの構築方法に違いはありません。なぜこれが問題になるのでしょうか、それとも本当に問題なのですか?2番目のファイル(Sinatraクラスのないファイル)を別のlibフォルダーに入れようとすると、クラス名を呼び出しても機能しますが、「Sinatra::Application」を呼び出しても機能しません。

4

1 に答える 1

7

最上位のコードは に委任される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
于 2012-04-20T08:53:50.333 に答える