Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Configuration 在Heroku上部署Sinatra应用程序_Configuration_Sinatra_Rackup - Fatal编程技术网

Configuration 在Heroku上部署Sinatra应用程序

Configuration 在Heroku上部署Sinatra应用程序,configuration,sinatra,rackup,Configuration,Sinatra,Rackup,在Heroku上部署Sinatra应用程序并不是一个实际问题,只是一个概念上的难题,这让我感到困惑 我有两个应用程序,几乎在各个方面都是相同的,只是其中一个将其大部分逻辑放在一个不包含Sinatra::基类的文件中,并使用“require otherfilename”来获取所需的逻辑。那个Sinatra:基类被命名为Kincalc 对于在一个文件中包含所有逻辑的应用程序(即,包含Sinatra:Base类的同一个文件),在我的config.ru文件中,最后一行是“run Sinatra::App

在Heroku上部署Sinatra应用程序并不是一个实际问题,只是一个概念上的难题,这让我感到困惑

我有两个应用程序,几乎在各个方面都是相同的,只是其中一个将其大部分逻辑放在一个不包含Sinatra::基类的文件中,并使用“require otherfilename”来获取所需的逻辑。那个Sinatra:基类被命名为Kincalc

对于在一个文件中包含所有逻辑的应用程序(即,包含Sinatra:Base类的同一个文件),在我的config.ru文件中,最后一行是“run Sinatra::Application”,它可以正常启动。但在另一个应用程序中,如果我把它作为最后一行,该应用程序会正确上传,并说它“部署到Heroku”,但它会显示一条“找不到”消息。当我的最后一行读作“run Kincalc”时,它可以正常加载


我已经反复检查了这两个应用程序的构建方式,除了其中一个使用第二个文件作为逻辑(也是根文件)之外,没有什么不同。为什么这会是个问题,或者这真的是个问题?当我尝试将第二个文件(没有Sinatra类的文件)放在一个单独的lib文件夹中时,当我调用类名时,它仍然有效,但当我调用“Sinatra::Application”时则无效。

顶级代码将委托给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
Kincalc.get '/' do
  'hi'
end
结果输出应为:

in a, top level: main
in a, nested: Example
in b: main
因此,如果您想使用一个模块化应用程序,您应该这样做:

# app.rb
require 'sinatra/base'

class Kincalc < Sinatra::Base
  get '/' do
    'hi'
  end
end

# config.ru
require './app'
run Kincalc
# 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
#app.rb
需要“sinatra/基地”
需要“./otherfilename”
类Kincalc
或者,您可以更改顶级DSL方法的授权位置:

# app.rb
require 'sinatra/base'

class Kincalc < Sinatra::Base
  Sinatra::Delegator.target = self
  require './otherfilename'
end
#app.rb
需要“sinatra/基地”
类Kincalc
顶级代码将委托给
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
Kincalc.get '/' do
  'hi'
end
结果输出应为:

in a, top level: main
in a, nested: Example
in b: main
因此,如果您想使用一个模块化应用程序,您应该这样做:

# app.rb
require 'sinatra/base'

class Kincalc < Sinatra::Base
  get '/' do
    'hi'
  end
end

# config.ru
require './app'
run Kincalc
# 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
#app.rb
需要“sinatra/基地”
需要“./otherfilename”
类Kincalc
或者,您可以更改顶级DSL方法的授权位置:

# app.rb
require 'sinatra/base'

class Kincalc < Sinatra::Base
  Sinatra::Delegator.target = self
  require './otherfilename'
end
#app.rb
需要“sinatra/基地”
类Kincalc
在我的情况下,路由在Sinatra::基类Kincalc中,它位于Kincalc.rb中。该文件在类def上方还有'require'sinatra'和'require./otherfilename'语句。URI的逻辑(post'/calculate'do等)都在otherfilename.rb中。那么,我如何将你的最后一个建议映射到这个结构中呢?假设我想将路由保留在Kincalc类中(在require语句下面),那么config.ru是什么样子?当我尝试将其从“runkincalc”更改为运行Sinatra::Application时,它仍然不起作用。不,我没有完全正确地理解它。路由都在Sinatra::基类(在kincalc.rb中)中,但它们的逻辑在otherfilename.rb(占位符)中。我想保持顶级应用程序文件的整洁,只需将路由以及路由中使用的功能和逻辑分开。我想我不明白词法范围是如何影响这一点的。不过,这确实是一个假设问题。我想我可以用“run Kincalc”让它走——这两种方式都没有什么不同!在我的情况下,路由在Sinatra::基类Kincalc中,它位于Kincalc.rb中。该文件在类def上方还有'require'sinatra'和'require./otherfilename'语句。URI的逻辑(post'/calculate'do等)都在otherfilename.rb中。那么,我如何将你的最后一个建议映射到这个结构中呢?假设我想将路由保留在Kincalc类中(在require语句下面),那么config.ru是什么样子?当我尝试将其从“runkincalc”更改为运行Sinatra::Application时,它仍然不起作用。不,我没有完全正确地理解它。路由都在Sinatra::基类(在kincalc.rb中)中,但它们的逻辑在otherfilename.rb(占位符)中。我想保持顶级应用程序文件的整洁,只需将路由以及路由中使用的功能和逻辑分开。我想我不明白词法范围是如何影响这一点的。不过,这确实是一个假设问题。我想我可以用“run Kincalc”让它走——这两种方式都没有什么不同!请显示heroku错误消息以及您的config.ru文件和“应用程序文件”,或者如果解决了您的问题,请接受@KonstantinHaase的答案。如果解决了您的问题,请显示heroku错误消息以及您的config.ru文件和“应用程序文件”,或者接受@KonstantinHaase的答案。