Обслуживание XHTML в качестве приложения / xhtml + xml с Ruby on Rails - PullRequest
3 голосов
/ 04 июля 2010

Я пытаюсь, чтобы мое приложение 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 ]

2 голосов
/ 07 июля 2010

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

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

response.content_type = "application/xhtml+xml"
0 голосов
/ 05 июля 2010

Добавьте это к вашему 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 Transitional.

...