2010-11-30 34 views
1

这可能有点棘手。我的网站的“根”页面由posts#index操作呈现。为了支持RSS和HTML,我有一个respond_to代码块,看起来像:Rails的respond_to处理XML,但缓存HTML

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: text/xml 

然后Rails会过程它作为XML(可能是正确的),但CACHES为HTML,破坏我的缓存。该网站的下一个访问者将永远服务器实际上包含XML的html文件。这里是证明发生这种情况的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?

回答

0

您正在使用哪个版本的Rails?如果您使用旧版本,则可能需要升级。 (.rxml扩展名是旧的afaik)

这看起来像一个bug。我记得两年前有类似的问题(IE说它接受XLS,但没有提到HTML)。

我相信它已在最近的版本中修复。

我曾经通过修改IE的HTTP_ACCEPT头来解决它。 (挖了一些旧代码)

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') 

但我不建议做这样的事情,你试过更理智的选择了。

+0

我在轨道3.0.3上。我实际上浏览了rails源代码,如果URL中没有格式,则默认为.html。它实际上根本不考虑处理格式。我通过强制网站根目录来解决它:格式=> HTML在我的路线文件,但我仍然认为这是一个错误!另外,我可以看到其他索引页面的潜在问题,所以它根本就没有固定! – 2010-12-01 23:34:32

0

如果您更改您对XML的请求以指向/.xml,那么我认为缓存应区分HTML和XML,因为它们将是不同的URL。

我有一个Backbone.js应用程序的同样的问题。如果我从/导航到/tasks,然后点击后退按钮,Chrome将提供缓存的HTML版本/tasks,而不是加载JSON版本。解决的办法是确保我的主干模型调用/tasks.js而不是仅仅调用/tasks。 Rails 3.x路由采用该格式作为URL末尾的可选部分,这有助于浏览器和服务器之间的任何缓存区分不同格式(如果他们没有查看接受/内容类型标题)。