Обслуживание XHTML в качестве приложения /xhtml+xml с Ruby on Rails

Я пытаюсь заставить мое приложение Rails правильно обслуживать контент XHTML с правильным типом контента application/xhtml+xml. Идеально с согласованием контента, чтобы пользователи IE тоже могли использовать сайт.

Учитывая, что весь HTML-код, сгенерированный Rails, помечен в XHTML 1.0 Transitional, я немного удивлен, что не существует очевидного варианта, чтобы Rails служил разметкой как XHTML. Я нашел это http://blog.codahale.com/2006/05/23/rails-plugin-xhtml_content_type/, но, похоже, это для 1.1.2, и я не могу заставить его работать должным образом под 2.3.8.

Я что-то здесь пропустил?

3 ответа

Решение

Хорошо, у меня есть кое-что, что работает сейчас. Спасибо @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].

Вы можете принудительно установить тип содержимого в любой функции контроллера или с помощью фильтра после. Любой из этих методов может установить тип содержимого через:

response.content_type = "application/xhtml+xml"

Добавьте это к вашему 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/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 переходный.

Другие вопросы по тегам