根据我的理解,所有的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个页面上包含相同的代码。事实上,您再也不需要在站点的任何地方包含手动脚本标记。

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


当前回答

我知道你已经回答了自己的问题,但还有另一种选择

基本上,您假设//= require_tree。是必需的。事实并非如此。请随意删除它。在我当前的应用程序中,第一个应用程序使用3.1。老实说,我已经做了三个不同的顶级JS文件。我的application.js文件只有

//= require jquery
//= require jquery_ujs
//= require_directory .
//= require_directory ./api
//= require_directory ./admin

通过这种方式,我可以创建子目录,其中包含自己的顶级JS文件,只包括我需要的内容。

关键是:

你可以删除require_tree——Rails允许你改变它所做的假设 application.js这个名字没有什么特别之处——assets/javascript子目录下的任何文件都可以包含带有//=的预处理指令

希望这对ClosureCowboy的回答有所帮助,并添加了一些细节。

其他回答

下面是如何做到这一点,特别是如果你不需要为特定的页面执行大量的库,而只需要运行几百行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?

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

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

资产管道文档建议如何做特定于控制器的JS:

例如,如果生成了一个ProjectsController,则会在app/assets/javascripts/projects.js中生成一个新文件。Coffee和另一个在app/assets/stylesheets/projects.css.scss。你应该在它们各自的资产文件中放入一个控制器唯一的JavaScript或CSS,因为这些文件可以仅为这些控制器加载诸如<%= javascript_include_tag params[:controller] %>或<%= stylesheet_link_tag params[:controller] %>这样的行。

链接到:asset_pipeline

菲利普的回答很好。下面是让它工作的代码:

在application.html.erb:

<身体类= " < % = params[:控制器].parameterize % > " >

假设你的控制器叫做Projects,它会生成:

<身体类= "项目" >

然后在projects.js.coffee中:

jQuery ->
  if $('body.projects').length > 0  
     $('h1').click ->
       alert 'you clicked on an h1 in Projects'

将你所有常用的JS文件移动到像'app/assets/javascript/global'这样的子文件夹中,然后在application.js中修改//= require_tree . JS文件。行到//= require_tree ./global。

现在你可以自由地把你的控制器特定的JS放在'app/assets/javascript/'根目录下,它们不会被包含在编译的JS中,只在你通过= javascript_include_tag在你的控制器/视图上调用它们时使用。