2012-10-09 27 views
3

我正在創建一個Sinatra Web應用程序,我想爲所有服務的網頁提供MIME類型application/xhtml+xml。我使用Builder作爲模板引擎。請注意,該應用程序還將爲application/xml提供各種AJAX api界面,同樣使用Builder模板引擎以及使用scss模板引擎的text/css爲Sinatra服務XHTML

我注意到,生成的網頁接收到text/html內容類型,而api接口取而代之的是內容類型application/xml。但是,我不知道mime類型是如何決定的; html標籤的存在?是否使用佈局?無論如何,我希望應用程序發佈一個application/xhtml+xml mime類型,而不是text/html mime類型。

我知道我可以用content_type調用指定MIME類型,但是我想避免在每個路由功能中都需要這個。有什麼方法可以爲給定的模板引擎設置默認的MIME類型?或者可以通過視圖的文件名來控制MIME類型? Tilt是否提供了任何方法來以好方式控制MIME類型?

+0

Sinatra文檔解釋了一種基於文件擴展名配置MIME類型的方法:[Readme-Mime types](http://www.sinatrarb.com/intro#Mime%20Types)。 您可以使用'before do'塊並設置'content_type',但我不確定這是否是完成此操作的最佳方法。 –

+0

另外,我在你的文章中加入了標籤'ruby',你可能會獲得更多的流量。 –

+0

除非您專門將其更改,否則使用Builder的_all_請求將具有'application/xml'作爲內容類型。你有'之前'或之後的塊設置'content_type'嗎? – matt

回答

3

由於您的應用程序被分解爲單獨的對象,因此將所有AJAX路由引入獨立的Sinatra應用程序應該很簡單。這將允許你使用Sinatra的後鉤。唯一的要求是你的AJAX調用有一些標識爲AJAX的東西;例如,通過將請求標頭設置爲特殊值或使用特殊格式的路由。這裏是唯一的路由方法的一例rackup文件:

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 hook確保這些響應的內容類型是'application/xml'。非Ajax路由不受影響。

有幾件事情要記住:

  • 架:: Builder.map剝掉它匹配的URL部分。所以AjaxRoutes中的'/'路線實際上會回答'/ ajax /'的請求。
  • 始終在您的Sinatra派生端點類的初始化程序中調用super()。對於Sinatra中間件,向上傳遞第一個參數(機架調用#new與下一個機架應用程序作爲第一個參數)。
  • 查看有關Sinatra filters的文檔。使用after hook修改響應有一個潛在的令人沮喪的怪癖。
+0

這是如何幫助我? AJAX的東西不是一個單獨的應用程序。我有一個應用程序共享網頁,AJAX內容以及樣式表之間所需的數據,這三者中的每一個都應該給出它們自己的MIME類型。順便說一句,AJAX的東西是'應用/ xml'不'是application/xhtml + xml',這將是網頁。 – wich

+2

應用程序是指Rack端點,它不是一個完全孤立的實體。如果您不瞭解Rack,並且無法從我上面概述的方法推斷,我會很樂意刪除我的答案。 – Catnapper

+0

Catnapper,你能否提供一個更清晰的例子來說明你的意思?我並不熟悉Rack和Sinatra。 – wich

相關問題