由于您的应用程序被分解为单独的对象,因此将所有 AJAX 路由拉入单独的 Sinatra 应用程序应该很简单。这将允许您使用 Sinatra 的 after hook。唯一的要求是您的 AJAX 调用具有将它们标识为 AJAX 的内容;例如,通过将请求标头设置为特殊值,或使用特殊格式的路由。这是唯一路由方法的示例机架文件:
require 'sinatra/base'
class MainApp
def get_info params
# return some data structure
end
end
class MainAppRoutes < Sinatra::Base
def initialize mainapp
super()
@mainapp = mainapp
end
get '/' do # main page
data = @mainapp.get_info(params)
# render response from data
end
end
class AjaxRoutes < Sinatra::Base
def initialize mainapp
super()
@mainapp = mainapp
end
get '/getinfo' do # handler for /ajax/getinfo
data = @mainapp.get_info(params)
# generate XML response from data
end
after do
content_type 'application/xml'
end
end
mainapp = MainApp.new
map '/ajax' do
run AjaxRoutes.new(mainapp)
end
run MainAppRoutes.new(mainapp)
在此示例中,所有以 /ajax 开头的路由都由 AjaxRoutes 类的实例处理。after 钩子确保这些响应的内容类型是“application/xml”。非 ajax 路由不受影响。
需要记住的几件事:
- Rack::Builder.map 去掉它匹配的 URL 部分。所以AjaxRoutes 中的'/' 路由实际上会响应'/ajax/' 的请求。
- 始终在 Sinatra 派生端点类的初始化程序中调用 super()。对于 Sinatra 中间件,向上传递第一个参数(Rack 调用 #new 并将下一个 rack 应用程序作为第一个参数)。
- 查看有关Sinatra 过滤器的文档。使用 after 钩子修改响应有一个潜在的令人沮丧的怪癖。