2012-10-09 2 views
3

Я создаю веб-приложение Sinatra, которое я хотел бы использовать mime-тип application/xhtml+xml для всех обслуживаемых веб-страниц. Я использую Builder в качестве механизма шаблонов. Обратите внимание, что приложение также будет обслуживать application/xml для различных интерфейсов api AJAX, также используя механизм шаблонов Builder, а также text/css с использованием механизма шаблонов scss.Обслуживание XHTML с Sinatra

Я заметил, что созданные веб-страницы получают тип контента text/html, тогда как интерфейсы api получают вместо этого тип контента application/xml. Однако я не знаю, как определяется тип mime; наличие метки html? использование макета или нет? В любом случае, я хотел бы, чтобы приложение выдало тип mcetype application/xhtml+xml вместо типа mime text/html.

Я знаю, что я могу указать тип mime с вызовом content_type, но я бы хотел воздержаться от необходимости этого в каждой функции маршрутизации. Есть ли способ установить тип mime по умолчанию для данного механизма шаблонов? Или можно управлять типом mime с помощью имени файла вида? Отличается ли Tilt любыми средствами для управления типом MIME?

+0

Документы Sinatra объясняют способ настройки типов mime на основе расширения файла: [Readme - Mime types] (http://www.sinatrarb.com/intro#Mime%20Types). Вы могли бы использовать блок 'before do' и задавать' content_type' таким образом, но я не уверен, что это лучший способ выполнить это. –

+0

Кроме того, я добавил тег 'ruby' на ваш пост, вы можете получить больше трафика таким образом. –

+0

Если вы не меняете его где-то, _all_-запросы с использованием Builder будут иметь 'application/xml' в качестве типа содержимого. У вас есть 'before' или after block, где вы устанавливаете' content_type'? – matt

ответ

3

Поскольку ваше приложение учитывается на отдельных объектах, должно быть просто потянуть все маршруты AJAX в отдельное приложение Sinatra. Это позволит вам использовать Sinatra после крючка. Единственное требование - для вызовов AJAX иметь что-то, что идентифицирует их как AJAX; например, путем установки заголовка запроса на специальное значение или с помощью специально отформатированного маршрута. Вот пример rackup файл уникального метода маршрута:

require 'sinatra/base' 

class MainApp 

    def get_info params 
    # return some data structure 
    end 

end 

class MainAppRoutes < Sinatra::Base 

    def initialize mainapp 
    super() 
    @mainapp = mainapp 
    end 

    get '/' do # main page 
    data = @mainapp.get_info(params) 
    # render response from data 
    end 

end 

class AjaxRoutes < Sinatra::Base 

    def initialize mainapp 
    super() 
    @mainapp = mainapp 
    end 

    get '/getinfo' do # handler for /ajax/getinfo 
    data = @mainapp.get_info(params) 
    # generate XML response from data 
    end 

    after do 
    content_type 'application/xml' 
    end 

end 

mainapp = MainApp.new 

map '/ajax' do 
    run AjaxRoutes.new(mainapp) 
end 
run MainAppRoutes.new(mainapp) 

В этом примере все маршруты, начинающиеся с/AJAX обрабатываются экземплярами класса AjaxRoutes. Захват гарантирует, что тип содержимого для этих ответов будет «application/xml». Неадмакс-маршруты не затрагиваются.

Несколько вещей, чтобы помнить:

  • Rack :: Builder.map срывает в части URL он соответствует. Таким образом, маршрут «/» в AjaxRoutes фактически ответил бы на запрос «/ ajax /».
  • Всегда вызывайте super() в инициализаторах ваших конечных классов, полученных из Sinatra. Для промежуточного программного обеспечения Sinatra передайте первый аргумент вверх (Rack вызывает #new со следующим приложением в стойке в качестве первого параметра).
  • Просмотрите документ о Sinatra filters. Существует потенциально разочаровывающая причуда об изменении ответов с помощью крючка.
+0

Как это мне помогает? Материал AJAX не является отдельным приложением. У меня есть одно приложение, которое разделяет данные, необходимые между веб-страницами, содержимым AJAX, а также таблицами стилей, каждый из этих трех должен давать свой собственный тип mime. И, кстати, материал AJAX был бы «application/xml» не 'application/xhtml + xml', это были бы веб-страницы. – wich

+2

Приложение относится к конечной точке стойки, а не к полностью изолированному объекту. Если вы не понимаете Rack и не можете экстраполировать из подхода, описанного выше, я с радостью удалю свой ответ. – Catnapper

+0

Catnapper, не могли бы вы привести несколько более наглядный пример того, что вы имеете в виду? Я еще не знаком с Rack и Sinatra. – wich

Смежные вопросы