Это может быть немного сложнее. «Корневая» страница моего сайта отображается с помощью действия 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?