Rails response_to обрабатывает XML, но кэширует HTML - PullRequest
1 голос
/ 01 декабря 2010

Это может быть немного сложнее. «Корневая» страница моего сайта отображается с помощью действия posts # index. Для поддержки rss и html у меня есть блок response_to, который выглядит следующим образом:

 respond_to do |wants|
  wants.html 
  wants.xml {
    render :layout => false;
    response.headers["Content-Type"] = "application/xml; charset=utf-8"
  }
end

У меня также есть 'caches_page', установленный на странице индекса.

Если кто-то заходит на сайт в браузере и просто запрашивает «/», то ему предоставляется html-версия страницы, и Rails также пишет кэшированную страницу для index.html

На самом деле нет никакого способа запросить «/» с форматом XML, но если я нажму «/posts.xml», он отобразит XML и кеширует posts.xml (аналогично, если я нажму «/ posts» или « /posts.html "он будет кешировать posts.html). Это все работает просто отлично.

Теперь для хитрости. Если что-то запрашивает «/», но имеет заголовок accept, например:

Accept: text/xml

Тогда Rails будет обрабатывать это как XML (возможно, правильный), но CACHES это как html, разрушая мой кеш. Следующим посетителем сайта будет всегда сервер HTML-файл, который на самом деле содержит XML. Вот сообщение журнала Rails, доказывающее, что это происходит:

Started GET "/" for 127.0.0.1 at 2010-11-30 20:47:27 +0000
  Processing by PostsController#index as XML
  Post Load (1.4ms)  SELECT "posts".* FROM "posts" WHERE ...
Rendered posts/index.xml.rxml (243.8ms)
Write page /..../index.html (0.6ms)
Completed 200 OK in 423ms (Views: 244.8ms | ActiveRecord: 1.4ms)

Это функция или ошибка?

Лучше, кто-нибудь знает, как это исправить, чтобы он кэшировал файл как .xml, когда обрабатывает его как XML?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

Если вы измените свой запрос на XML так, чтобы он указывал на /.xml, то я думаю, что кэш должен различать HTML и XML, поскольку они будут разными URL-адресами.

У меня была такая же проблема с приложением Backbone.js.Если бы я перешел с / на /tasks, то при нажатии кнопки «Назад» Chrome будет использовать кэшированную HTML-версию /tasks вместо загрузки JSON-версии.Исправление было в том, чтобы убедиться, что мои модели Backbone звонили /tasks.js вместо /tasks.Маршруты Rails 3.x принимают формат в качестве дополнительной части в конце URL-адреса, что помогает любому кешу между вашим браузером и сервером различать разные форматы, если они не смотрят на заголовки accept / content-type.

0 голосов
/ 01 декабря 2010

Какую версию Rails вы используете?Возможно, вы захотите обновить, если у вас более старая версия.(расширение .rxml устарело)

Для меня это похоже на ошибку.Я помню подобные проблемы два года назад (IE говорит, что принимает XLS, но не упоминает HTML).

Я считаю, что это было исправлено в последних версиях.это путем изменения заголовка HTTP_ACCEPT для IE.(выкапывает старый код)

request.env["HTTP_ACCEPT"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" if request.env["HTTP_USER_AGENT"].include?('MSIE')

Но я бы не советовал делать что-то подобное, пока вы не попробовали более вменяемые варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...