Application.html布局将HAML / ERB中body标签后的所有内容放入HTML标记中

时间:2014-08-13 18:17:52

标签: ruby-on-rails

我试图在我的Rails应用程序(Rails 4.0.0,Ruby 2.1.1)中将一些第三方脚本文件放在body标签之外(根据第三方的请求)。我无法让这个适用于我的application.html文件(在HAML和ERB中都没有。)

HAML:

%body
   = yield
%script
  :javascript

ERB:

<body>
  <%= yield %>
</body>
<script>
  ...
</script>

无论我使用ERB还是HAML,生成的实时页面仍然会将此脚本标记放在主体标记的内部而不是外部。任何人都可以了解这是否是Rails&#39;行为以及它是否特定于Rails 4?或者它可能是浏览器在Rails之外做的事情?

更新: 有问题的application.html.haml文件(ENV变量解决没有问题):

!!!
%html{"xmlns" => "http://www.w3.org/1999/xhtml", "xmlns:fb" => "http://ogp.me/ns/fb#"}
%head
  / several meta tags
  %title= content_for?(:title) ? yield(:title) : "Title"
  / favicon image links
  = stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true
  = javascript_include_tag "application", "data-turbolinks-track" => true
  = javascript_include_tag "vendor/modernizr"
  = csrf_meta_tags
  %script{src: "//cdn.optimizely.com/js/---------.js"}
%body
  = yield
%script
  :javascript
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', "#{ENV['GA_ID']}", "#{ENV['GA_LABEL']}");
    ga('require', 'displayfeatures');
    // Optimizely Universal Analytics Integration
    window.optimizely = window.optimizely || [];
    window.optimizely.push("activateUniversalAnalytics");
    ga('send', 'pageview');

    /* <![CDATA[ */
    var google_conversion_id = ---------;
    var google_custom_params = window.google_tag_params;
    var google_remarketing_only = true;

由于

1 个答案:

答案 0 :(得分:1)

如果您在主体后放置脚本标记,则您的html无效。它位于头部或身体标签中。一点点研究可以给你一些解释,如this SO question

HTML5规范描述了浏览器应该如何处理错误。正如您在描述after after body insertion mode的部分所看到的,任何不是html标记,注释,doctype或文件结尾字符的内容都会将浏览器切换到&#34;在正文中#34;插入模式。

因此,换句话说,您的浏览器对HTML5的实现就是将您的脚本标记放在正文中。