如何在Rails 3.1资产管道中正确使用jQuery?

时间:2011-11-23 14:27:42

标签: jquery ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我正在开发一个爱好应用程序并使用一些jQuery。结果很好,但我是一个jQuery noob,我认为我可以对代码结构做一些重大改进。暂时搁置Coffescript,我一直想知道的一件事是如何在资产管道中正确使用特定于模型的.js文件。

例如,在使用我的用户模型时,我可能会在文档准备好时运行一些我想要运行的代码。假设我把它放在$(document).ready(function() {...});中由Rails 3.1生成的users.js文件中。

第二天,我正在使用Pet模型,我想要在文档准备好的情况下运行代码。我把它放在Rails准备的$(document).ready(function() {...});文件的另一个pets.js内。

以下是我的问题所在:

  1. 应用程序运行时如何编译?
  2. 我是否使用上面的示例实例化了两个jQuery实例?
  3. 我应该只在应用中使用$(document).ready(function() {...});一次,还是Rails将我的代码编译成一个电话?
  4. 什么属于特定于模型的.js文件?
  5. 它在开发和生产模式中的执行方式是否存在差异?

2 个答案:

答案 0 :(得分:12)

1)编译:Rails资产管道只是将所有javascript文件合并到一个大文件中。

2)jquery只加载一次,你有多个$(document).ready函数,但这不是问题

3)Rails对调用没有任何作用,jQuery可以安全地处理每页的更多块。

4)您将其称为特定于模型的.js,我宁愿将其称为特定于控制器。您将功能组合在一起。将它们联系在一起的东西是控制器还是模型真的无关紧要。我们将js拆分为单独的文件,以使其更易于管理。

5)在开发过程中,资产是根据每个请求编译的,在生产中它只进行一次。同样在生产中,它可以缩小和压缩。

希望这有帮助。

答案 1 :(得分:3)

我会尝试为你回答其中的一些问题。你真的只想要每页1个文件准备好的电话,但是如果你有倍数并不重要。它们中包含的内容将是DOM加载到浏览器后执行的代码。 Rails不会对javascript做任何神奇的事情,它会和你在文件中写的一样。 Rails不会以一种时髦的方式编译javascript代码,对于生产环境,它可能会缩小它,但实际代码将保持大致相同。这是由浏览器执行的 - 而不是服务器。

您没有实例化2个实例,因为jQuery只加载一次,然后被引用。 $(document).ready()调用本质上只是一个函数,仅此而已。

特定于模型的jquery文件可以在rails应用程序中与Ajax结合使用。所以你可以拥有像'create.js.erb'这样的文件,它实际上是一个你可以将rails操作传递到的javascript文件。如果你想在创建/删除帖子之后触发一些特定的代码,那么你可以使用这样的文件来做到这一点,你只需要在你的rails控制器中响应javascript - 但是你的意思是看看你上面的问题。

要记住的主要事情是jquery只是javascript和javascript由浏览器运行 - 在前端没有任何动态集成,总是在客户端运行,而jquery主要用于DOM操作。

希望这会清除一些东西!