3

我正在创建一个 Sinatra Web 应用程序,我想application/xhtml+xml为所有提供的网页提供 mime 类型。我使用 Builder 作为模板引擎。请注意,该应用程序还将application/xml为各种 AJAX api 接口提供服务,也使用 Builder 模板引擎,以及text/css使用 scss 模板引擎。

我注意到生成的网页会收到text/html内容类型,而 api 接口会收到application/xml内容类型。但是,我不知道 mime 类型是如何确定的;html标签的存在?布局的使用与否?无论哪种情况,我都希望应用程序发出application/xhtml+xmlmimetype 而不是text/htmlmime 类型。

我知道我可以通过content_type调用指定 mime 类型,但我想避免在每个路由函数中都需要它。有什么方法可以为给定的模板引擎设置默认的 mime 类型?或者可以通过视图的文件名控制 mime 类型吗?Tilt 是否提供任何方法来以一种很好的方式控制 mime 类型?

4

1 回答 1

3

由于您的应用程序被分解为单独的对象,因此将所有 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 钩子修改响应有一个潜在的令人沮丧的怪癖。
于 2012-10-11T21:44:27.100 回答