2010-07-04 59 views
3

我試圖讓我的Rails應用程序,以便正確提供XHTML內容,用正確的內容類型application/xhtml + xml的。理想情況下與內容協商,以便IE用戶也有機會使用該網站。服務XHTML爲on Rails應用程序/ xhtml + xml使用Ruby

鑑於由Rails的產生的所有HTML標記,在XHTML 1.0過渡,我有點驚訝的是沒有明顯的選項,以使Rails的標記作爲XHTML。我發現這個http://blog.codahale.com/2006/05/23/rails-plugin-xhtml_content_type/,但它似乎是1.1.2,我無法在2.3.8下正常工作。

我在這裏錯過了什麼嗎?

回答

2

好吧,我有一些作品了。感謝@danivovich在正確的位置開始我的工作。我必須做的第一件事就是理清MIME類型的mime_types.rb使HTML不是用XHTML別名:

module Mime 
    remove_const('HTML') # remove this so that we can re-register the types 
end 

Mime::Type.register "text/html", :html 
Mime::Type.register "application/xhtml+xml", :xhtml 

的我只是說這對我的應用程序控制器:

before_filter :negotiate_xhtml 
    after_filter :set_content_type 

    def negotiate_xhtml 
    @serving_polyglot = false 
    if params[:format].nil? or request.format == :html 
     @serving_polyglot = ((not request.accepts.include? :xhtml) or params[:format] == 'html') 
     request.format = :xhtml 
    end 
    end 

    def set_content_type 
    if @serving_polyglot 
     response.content_type = 'text/html' 
    end 
    end  

這確保了XHTML總是被加密,除非客戶端不接受它,或HTML已被明確請求。 HTML始終只是XHTML的一個多邊形。 @serving_polyglot變量在需要任何切換的視圖中可用。

這是在Chrome瀏覽器,Safari瀏覽器,Firefox,Opera和IE瀏覽器[6-8]爲我工作。

1

可以強制在任何控制器功能或過濾器之後使用的內容類型。這兩種方法都可以通過設置內容類型:

response.content_type = "application/xhtml+xml" 
+0

感謝,這讓我在正確的軌道上,但Rails的別名「text/html的」用「是application/xhtml + XML」(爲什麼?),所以客戶端是否發送了XHTML在接受我有麻煩找出頭。它總是被刪除/替換到我的before_filter的時間。檢測客戶端是否接受application/xhtml + xml的最好/最乾淨的方法是什麼? – derkyjadex 2010-07-05 15:25:45

+0

Fiddler2用於任何網絡流量,或Firebug for Firefox。 – danivovich 2010-07-06 01:34:49

0

添加到您的application_controller.rb

def correct_safari_and_ie_accept_headers 
    ajax_request_types = [ 'text/javascript', 'application/json', 'text/xml'] 
    request.accepts.sort!{ |x, y| ajax_request_types.include?(y.to_s) ? 1 : -1 } if request.xhr? 
end 

這校正了Safari和即接受報頭,以便它默認爲text/xml,而不是text/html。這個對我有用。在IE和Safari上都測試過。反正其他瀏覽器默認爲text/xml

編輯:我已將我的DOCTYPE設置爲<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">而不是XHTML Transitional。