页面呈现没有html,head和body元素

时间:2012-01-17 20:38:55

标签: ruby-on-rails ruby-on-rails-3.1 spree

我正在使用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>

1 个答案:

答案 0 :(得分:1)

我通过将ERb注释移出<html>容器并进入<head>容器来解决此问题。我没有时间确认的理论是,当使用Deface(在Spree中)时,即使ERb模板需要有效,并且<head>...</head><body>...</body>容器内还有其他任何容器{ {1}}无效。因此,Deface(或Nokogiri,Deface使用它)会重写它以强制它有效,或者它正在剥离这些容器,Rails在输出之前添加基本代码。