【问题标题】:Serving XHTML as application/xhtml+xml with Ruby on Rails使用 Ruby on Rails 将 XHTML 作为应用程序/xhtml+xml 提供服务
【发布时间】:2010-07-04 18:54:30
【问题描述】:

我正在尝试让我的 Rails 应用程序以正确的内容类型为 application/xhtml+xml 提供 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 下正常工作。

我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails xhtml content-type content-negotiation


    【解决方案1】:

    好的,我现在有一些东西可以使用。感谢@danivovich 让我在正确的地方开始。我要做的第一件事是整理 mime_types.rb 中的 Mime 类型,这样 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] 下。

    【讨论】:

      【解决方案2】:

      您可以在任何控制器函数或使用后过滤器中强制使用内容类型。这些方法中的任何一种都可以通过以下方式设置内容类型:

      response.content_type = "application/xhtml+xml"
      

      【讨论】:

      • 谢谢,这让我走上了正轨,但是 Rails 将“text/html”别名为“application/xhtml+xml”(为什么?)所以无法确定客户端是否已发送接受标头中的 XHTML。它总是在到达我的 before_filter 时被删除/替换。检测客户端是否接受 application/xhtml+xml 的最佳/最干净的方法是什么?
      • 用于任何网络流量的 Fiddler2,或用于 Firefox 的 Firebug。
      【解决方案3】:

      将此添加到您的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 和 ie 接受标头,使其默认为 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 过渡。

      【讨论】:

        猜你喜欢
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多