如何在模块化Sinatra应用程序中正确配置。

时间:2012-03-08 08:31:59

标签: ruby sinatra rack

我正在尝试在Sinatra应用程序中使用子类化样式。所以,我有一个像这样的主要应用程序。

class MyApp < Sinatra::Base
  get '/' 
  end

  ...
end

class AnotherRoute < MyApp
  get '/another'
  end

  post '/another'
  end
end
run Rack::URLMap.new \ 
  "/"       => MyApp.new,
  "/another" => AnotherRoute.new

在config.ru中我明白它只是为了“GET”其他资源如何(例如“PUT”,“POST”)?我不确定我是否错过了一些明显的东西。如果我有十个路径(/ path1,/ path2,...),我是否必须在config.ru中配置它们,即使它们在同一个类中?

3 个答案:

答案 0 :(得分:15)

app.rb

class MyApp < Sinatra::Base
  get '/' 
  end
end

app2.rb如果你想要两个单独的文件。请注意,这继承自Sinatra :: Base而非MyApp。

class AnotherRoute < Sinatra::Base
  get '/'
  end

  post '/'
  end
end

config.ru

require 'bundler/setup'
Bundler.require(:default)

require File.dirname(__FILE__) + "/lib/app.rb"
require File.dirname(__FILE__) + "/lib/app2.rb"


map "/" do
    run MyApp
end

map "/another" do
    run AnotherRoute
end

答案 1 :(得分:5)

您可以将其写为

class MyApp < Sinatra::Base
  get '/' 
  end
  get '/another'
  end

  post '/another'
  end
end

在config.ru中

require './my_app'
run MyApp

执行命令

rackup -p 1234

请参阅http://www.sinatrarb.com/intro#Serving%20a%20Modular%20Application

上的文档

答案 2 :(得分:4)

使用URLMap指定应安装应用的基本网址。在确定在应用程序本身中使用哪条路径时,不会使用映射中指定的路径。换句话说,在URLMap中使用的路径之后,应用程序的行为就像 一样。

例如,您的代码将响应以下路径:

  • /:将被/

  • 路由到MyApp路线
  • /another:将转到/中的AnotherRoute路线。由于AnotherRoute扩展MyApp,这与/中的MyApp相同(但在不同的实例中)。

    URLMap看到/another并使用它来映射到AnotherRoute,从路径中剥离请求的这部分内容。 AnotherRoute然后才会看到/

  • /another/another:将被路由到/another中的两个AnotherRoute路由。同样,URLMap使用第一个another将请求路由到AnotherRouteAnotherRoute然后只会看到第二个another作为路径。

    请注意,此路径会响应GETPOST个请求,每个请求都由相应的块处理。

目前还不清楚你要做什么,但我认为你可以通过运行AnotherRoute的实例来实现你想要的,而config.ru就是:

run AnotherRoute.new

由于AnotherRoute扩展MyApp,因此将为其定义/路由。

如果您正在寻找一种向现有Sinatra应用程序添加路由的方法,您可以create a module with an included method that adds the routes,而不是使用继承。