我正在尝试在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中配置它们,即使它们在同一个类中?
答案 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
将请求路由到AnotherRoute
。 AnotherRoute
然后只会看到第二个another
作为路径。
请注意,此路径会响应GET
和POST
个请求,每个请求都由相应的块处理。
目前还不清楚你要做什么,但我认为你可以通过运行AnotherRoute
的实例来实现你想要的,而config.ru
就是:
run AnotherRoute.new
由于AnotherRoute
扩展MyApp
,因此将为其定义/
路由。
如果您正在寻找一种向现有Sinatra应用程序添加路由的方法,您可以create a module with an included
method that adds the routes,而不是使用继承。