3

アプリケーション/xhtml+xml の正しいコンテンツ タイプを使用して、Rails アプリで XHTML コンテンツを適切に提供しようとしています。理想的には、コンテンツ ネゴシエーションを使用して、IE ユーザーもサイトを使用する機会を得られるようにします。

Rails によって生成されたすべての HTML が XHTML 1.0 Transitional でマークされていることを考えると、Rails がマークアップを XHTML として提供するための明らかなオプションがないことに少し驚いています。http://blog.codahale.com/2006/05/23/rails-plugin-xhtml_content_type/を見つけましたが、1.1.2 用のようで、2.3.8 では正しく動作しません。

ここで何かを見逃しましたか?

4

3 に答える 3

2

わかりました、私は今うまくいくものを持っています。適切な場所で私を始めてくれた@danivovichに感謝します。私が最初にやらなければならなかったのは、HTMLがXHTMLでエイリアス化されないように、mime_types.rbのMimeタイプを分類することでした。

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が明示的に要求されていない限り、XHTMLは常にそのようにサーバー化されます。HTMLは常に、ポリグロットとして機能するXHTMLです。@serving_polyglot変数は、切り替えが必要なビューで使用できます。

これは、Chrome、Safari、Firefox、Opera、IE[6-8]で機能しています。

于 2010-07-06T21:52:05.993 に答える
1

任意のコントローラー関数で、またはアフター フィルターを使用して、コンテンツ タイプを強制できます。これらの方法のいずれかで、次の方法でコンテンツ タイプを設定できます。

response.content_type = "application/xhtml+xml"
于 2010-07-04T19:42:27.037 に答える
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

これにより、サファリが修正され、ヘッダーが受け入れられるようになり、デフォルトtext/xmltext/html. わたしにはできる。IE と Safari の両方でテスト済み。他のブラウザのデフォルトはtext/xmlとにかくです。

EDIT : DOCTYPE を<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">XHTML Transitional ではなくに設定しました。

于 2010-07-05T05:00:50.860 に答える