Обслуживание 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 переходный.