我正在使用Spree 0.70,Rails 3.1和Ruby 1.9开发网站。我注意到有些页面在没有<html><head></head><body></body></html>
块的情况下进行渲染。
相反,Rails似乎是自动将页面包装在<html><body></body></html>
块中,这意味着任何打算在头部的代码(即CSS包括,页面title
块等)显示在身体内部,任何依赖于头部或身体标签(例如CSS)的属性的东西都不起作用,因为缺少这些元素。
这让我很困惑,因为很明显我的布局正在渲染,部分和全部,但这些顶级元素被忽略或覆盖。
当我说“某些页面”时,我已经确认它在管理页面中没有发生,并且它不会发生在仅限于我的应用程序的页面中(即它们不使用spree_application.html.erb
布局及其控制器不是Spree::BaseController
的子类。)我已经通过在我的应用程序中制作副本来覆盖spree_application.html.erb
布局(我别无选择),并且所有具有此问题的页面都使用该布局。这可能是一个因素吗? (Here is a page with the broken layout.)
如何恢复我的根元素?
ETA:这是我在app/views/layouts/spree_application.html.erb
的应用中的文件。这是显示问题的所有页面都有共同的布局。请注意,div结构与Spree提供的布局略有不同;这就是为什么我需要替换布局而不是使用Deface覆盖。
<!DOCTYPE HTML>
<%# Overrides the Spree default template %>
<html>
<head data-hook="inside_head">
<%= render 'shared/head' %>
<!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="/stylesheets/ie.css" />
<![endif]-->
</head>
<body class="<%= body_class %>" id="<%= @body_id || 'default' %>" data-hook="body">
<div id="page-scroll" data-hook>
<div class='header-wrapper'></div>
<div id="header" data-hook>
<ul id="nav-bar" data-hook>
<%= render 'shared/nav_bar' %>
</ul>
<%= render 'shared/logo' %>
</div>
<div id="wrapper" data-hook>
<%= render 'shared/content' %>
</div>
</div>
<%= render 'shared/footer' %>
<%= render 'shared/google_analytics' %>
</body>
</html>
答案 0 :(得分:1)
我通过将ERb注释移出<html>
容器并进入<head>
容器来解决此问题。我没有时间确认的理论是,当使用Deface(在Spree中)时,即使ERb模板需要有效,并且<head>...</head><body>...</body>
容器内还有其他任何容器{ {1}}无效。因此,Deface(或Nokogiri,Deface使用它)会重写它以强制它有效,或者它正在剥离这些容器,Rails在输出之前添加基本代码。