根据我的理解,所有的JavaScript都合并到一个文件中。Rails在添加//= require_tree时默认这样做。到你的application.js manifest文件的底部。

这听起来像是一个真正的救星,但我有点担心特定于页面的JavaScript代码。这段代码是否在每一页上执行?我想要的最后一件事是当我的所有对象只在1页上需要时,为每一页实例化它们。

此外,代码是否也有可能发生冲突?

还是在页面底部放置一个小的脚本标记,只调用一个执行页面javascript代码的方法?

你不再需要require.js了吗?

谢谢

编辑:我很感激所有的答案…我认为他们并没有真正解决问题。其中一些是关于样式的,似乎没有关联……其他人只是提到javascript_include_tag…我知道这是存在的(很明显…),但Rails 3.1的前进方式似乎是将所有JavaScript打包到一个文件中,而不是在每个页面的底部加载单个JavaScript。

我能想到的最好的解决方案是用id或类将某些特性包装在div标签中。在JavaScript代码中,只需检查id或类是否在页面上,如果在,则运行与之关联的JavaScript代码。这样,如果动态元素不在页面上,JavaScript代码就不会运行——即使它包含在由Sprockets打包的庞大application.js文件中。

我上面的解决方案的好处是,如果一个搜索框包含在100个页面中的8个页面上,那么它将只在这8个页面上运行。你也不需要在网站的8个页面上包含相同的代码。事实上,您再也不需要在站点的任何地方包含手动脚本标记。

我想这就是我问题的真正答案。


当前回答

另一种选择:要创建特定于页面或模型的文件,您可以在assets/javascripts/文件夹中创建目录。

assets/javascripts/global/
assets/javascripts/cupcakes
assets/javascripts/something_else_specific

你的主application.js清单文件可以配置为从global/加载它的文件。特定的页面或页面组可以有它们自己的清单,这些清单从它们自己的特定目录加载文件。Sprockets会自动将application.js加载的文件与特定于页面的文件结合起来,这使得这个解决方案可以工作。

这种技术也可以用于style_sheets/。

其他回答

我有另一个解决方案,虽然原始的工作对我来说很好,不需要任何花哨的选择性加载策略。放入普通的文档准备函数,然后测试当前的窗口位置,看看它是否是你的javascript所针对的页面:

$(document).ready(function() {
   if(window.location.pathname.indexOf('/yourpage') != -1) {
          // the javascript you want to execute
   }
}

这仍然允许rails 3加载所有的js。X放在一个小包中,但不会产生太多开销,也不会与js不打算用于的页面产生任何冲突。

我还没有尝试过这个方法,但看起来下面的方法是正确的:

如果你有一个content_for是javascript(例如与真正的javascript在里面),链轮将不知道它,因此这将以同样的方式工作,因为它现在。 如果你想从javascript包中排除一个文件,你可以进入config/sprockets。并相应地修改source_files文件。然后,您只需在需要的地方包括您排除的任何文件。

下面是如何做到这一点,特别是如果你不需要为特定的页面执行大量的库,而只需要运行几百行JS或多或少。

因为它完全可以将Javascript代码嵌入到HTML中,只需在app/views共享.js目录下创建,并在my_cool_partial.html.erb中放置页面/页面特定代码

<script type="text/javascript"> 
<!--
  var your_code_goes_here = 0;
  function etc() {
     ...
  }
-->
</script>

所以现在无论你想在哪里,你只要做:

  = render :partial => 'shared.js/my_cool_partial'

这就是k?

LoadJS gem是另一个选项:

LoadJS提供了一种在Rails应用程序中加载特定页面Javascript代码的方法,而不会失去由Sprockets提供的魔力。你所有的Javascript代码都将被压缩到一个Javascript文件中,但它的某些部分只会在某些页面上执行。 https://github.com/guidomb/loadjs

Ryguy的答案是一个很好的答案,尽管它被投票为负分。

特别是如果你使用的是Backbone JS——每个页面都有自己的Backbone视图。然后,erb文件只有一行内联javascript,用于启动正确的骨干视图类。我认为它是一行“胶水代码”,因此它的内联是可以的。这样做的好处是你可以保留你的“require_tree”,它可以让浏览器缓存所有的javascript。

在show.html。你会得到这样的东西:

<% provide :javascript do %>
  <%= javascript_include_tag do %>
    (new app.views.ProjectsView({el: 'body'})).render();
  <% end %>
<% end do %>

在你的布局文件中,你需要:

<%= yield :javascript %>