在rails中使用content_for包含内联javascript

时间:2010-03-17 17:54:12

标签: javascript ruby-on-rails content-for

我正在使用content_for和yeild将javascript文件注入我的布局底部,但我想知道包含内联javascript的最佳做法是什么。具体来说,我想知道把脚本类型声明放在哪里:

<% content_for :javascript do %> 
  <script type="text/javascript"> ... </script>
<% end %>

<% content_for :javascript do %> ... <% end %>
  <script type="text/javascript">
    <%= yield :javascript %>
  </script>
<% end %>

我现在正在使用第一个选项,并想知道包含多个

是否不好  ... 一个视图中的

声明。有时我会偏袒这一点。

2 个答案:

答案 0 :(得分:30)

我更喜欢让布局的产量看起来像这样:

<html>
  <!-- other stuff -->
  <body>
   <!-- other stuff  -->
   <%= yield :javascript %>
  </body>
</html>

然后在视图中你可以写:

<% content_for :javascript do %>
  <script type='text/javascript'>
    function doMagic() {
      //Mind-blowing awesome code here
    }
  </script>

<% end %>

<!-- More view Code -->

<%= render :partial => "sub_view_with_javascript" %>

在部分_sub_view_with_javascript.html.erb中你也可以写:

<% content_for :javascript do %>
  <script type='test/javascript'>
     function DoMoreMaths() {
       return 3+3;
     }
   </script>
<% end %>

我对这种方法的推理是yield和content_for在不同的文件中。为每个content_for 设置脚本标记并不是DRY,但它允许语法高亮显示识别每个文件中语言的变化并帮助我。

如果你在一个文件中有多个content_for调用到同一个符号(在我们的例子中是:javascript),我会考虑将它们全部合并到最顶层,但它非常适合与partials一起使用。

HTML非常乐意拥有您想要的尽可能多的脚本块。唯一可能的问题是在使用firebug等开发人员工具中的代码时,需要花费更多的时间为您的函数找到正确的脚本块。当我需要设置一个javascript断点进行调试时,这只会发生在我身上。

答案 1 :(得分:1)

如果你真的想要保持&lt;的数量,这是一个解决方案。脚本&GT;在你的HTML中标记最小值,并且仍然可以让你的IDE突出显示javascript。如果你只想在你的html中调用一个$(document).ready(),或者在加载api时用facebook js api调用js,这对jquery非常有用......等等...

layout_helper.rb:

  def javascript_jquery_ready(script)
    content_for(:javascript_jquery_ready) {
      script .gsub(/(<script>|<\/script>)/, "")
    }
  end

application.html.erb:

<script>
    $(document).ready(function(){
        <%= yield(:javascript_jquery_ready) %>
    });
</script>

任何视图文件:

<% javascript_jquery_ready (capture do %>
  <script>
    $('#share_access_link').click(function(){
      $('#share_access_form').slideToggle();
    }); 
  </script>
<% end) %>

这个解决方案使我能够在IDE中保持代码的组织和可读性,因为我不需要为每个js代码创建部分代码。即使它对最终用户没有任何改变,html结果也更清晰。