Ruby on rails 如何在Rails3.1资源管道中分离javascript库和调用

Ruby on rails 如何在Rails3.1资源管道中分离javascript库和调用,ruby-on-rails,ruby-on-rails-3.1,asset-pipeline,Ruby On Rails,Ruby On Rails 3.1,Asset Pipeline,我正试图掌握整个资产管道的诀窍,并阅读指南和一些关于它们的教程。但有一件事还不太清楚,那就是我应该将javascript资产文件视为一个库还是一个放置实际运行的代码的地方,即$(document).ready。因为默认情况下,所有的javascript文件都包含在内,如果其中有几个$(document).ready,那就太奇怪了,更不用说你不想让每个页面都首先运行$(document).ready函数。这样做的方式是什么?将我的资源文件用作库并在我的视图中放置实际调用(丑陋)?或者有更好的方法吗

我正试图掌握整个资产管道的诀窍,并阅读指南和一些关于它们的教程。但有一件事还不太清楚,那就是我应该将javascript资产文件视为一个库还是一个放置实际运行的代码的地方,即$(document).ready。因为默认情况下,所有的javascript文件都包含在内,如果其中有几个$(document).ready,那就太奇怪了,更不用说你不想让每个页面都首先运行$(document).ready函数。这样做的方式是什么?将我的资源文件用作库并在我的视图中放置实际调用(丑陋)?或者有更好的方法吗?

如果您绝对不希望运行某段初始化代码,除非当前页面是特定的控制器/操作,那么您可以尝试使用以下两个帮助程序在页面上添加一个空元素,该元素的id是根据该信息构建的,如“posts\u index”:

“#{controller_name}#{action_name}”

然后在javascript中,您可以将代码封装在if语句中,该语句检查是否存在具有适当id的元素

编辑:下面是我在评论中提到的js部分的一个例子

show.html.haml

=渲染“映射”

map.html.erb
(我通常使用haml,但用erb编写js更容易)


...

它可能没有它所能做到的那么干净,而且它没有获得作为资产管道一部分的好处,但我不介意,因为它只是包含在特定页面上的东西。

我也遇到了这个问题。在大型项目中,您可以让某人将代码放入文档中,例如,使用类容器向div中的每个li添加一个单击函数

现在我们都可以说,上面的代码过于通用,当然可能会影响应用程序其他部分中的li标记,但项目越大,您就越有可能遇到这样的冲突,从而导致意外行为

就我个人而言,我对为每个加载的页面运行一大堆准备文档的函数感到不舒服。我的解决方案不一定是完美的,但我已经着手并将与大家分享

在每个页面的body标签中,我添加了表示控制器和动作的数据元素。然后我有一个文档就绪脚本,它查找一个以控制器命名并附加名称ready的类,例如HomeReady。然后,它将调用这个类上的一个方法(假定它存在),该类以操作命名。因此,您可以在资产咖啡文件中写入:

class @HomeReady
  @index: ->
    alert("Hello")
  @show: ->
    alert("Goodbye")

这允许控制权一直到操作级别。当我遇到你的问题时,我决定将这个解决方案打包成一个gem,因为我已经在几个项目中使用过它。您可以在以下网址找到它:

是什么迫使您为所有js文件使用document ready?如果您有一个Rails3.1JS之前的文件没有使用DocumentReady,那么它就不需要在Rails3.1中使用DocumentReady。另外,有几个文档就绪调用并不奇怪,它们只是将更多代码绑定到它。document.ready只是一个例子。主要问题是我应该如何将实际运行的代码与函数定义或库分开。当我在barcontroller呈现的页面上时,我不希望foocontroller的javascript运行。所以,基本上我不介意在我的barcontroller页面上使用我的foo函数,但我不想从中运行任何初始化代码。在Rails 3.1之前,你是如何做到这一点的?您是否在每个控制器/操作的基础上为
javascript\u include\u标记提供了不同的参数?我只会在application.html.erb中使用一个javascript\u include\u标记,它将包含我的库函数。然后我会使用一个额外的javascript include标记来包含特定于控制器的init javascript文件,该文件将执行绑定等操作。但是现在默认情况下已经包含了所有内容,所以我想知道最好的方法是什么。我不知道您有多少js组合,但是,可以安全地假设,Rails 3.1中js连接/缩小/md5哈希文件名的好处远远大于仅在绝对需要时运行各种js初始化代码集的好处。如果没有冲突,那么你应该让初始化代码在每一页上运行。我很感激你的回答,但在我看来,我遗漏了一些东西。正常的做法是什么。可能在视图中执行javascript?但这并不是不引人注目的。我需要更多关于包含所有javascript会导致冲突的信息。是因为元素不在页面上而导致特定函数失败吗?我有一些项目,我把谷歌可视化的代码放在部分(erb)中,并将它们呈现在适当的页面上,而不是放在资产目录中。这和你说的更接近吗?这就是我说的。我只想区分实际运行的javascript和javascript库。i、 e.包含jquery实际上并没有在我的页面上运行任何东西,所以我不介意在每个页面上都包含它。但例如,document.ready调用可能会更改我的页面,因此我只希望在需要时运行它。在资产管道中,我看不到这种区别,它包括所有东西,不管它是一个库还是需要运行的代码。我在检查是否可以用yield:javascript这样的东西来完成。你能解释一下如何用partials来设置它吗?(不符合我之前的评论)。我想我只需要更具体的东西。您能从一个pa中包含一个页面特定javascript的真实示例吗
class @HomeReady
  @index: ->
    alert("Hello")
  @show: ->
    alert("Goodbye")