如何在Rails 3.1资产管道中分离javascript库和调用

时间:2012-02-23 15:48:52

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

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

2 个答案:

答案 0 :(得分:1)

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

现在我们都可以争辩说上面的代码太通用了,当然可能会影响应用程序其他部分的 li 标签,但项目越大,你就越有可能会遇到这样的冲突,导致意外行为。

对于每一个加载的页面运行的大量文档就绪函数,我感到很不舒服。我的解决方案不一定是完美的解决方案,但它是我已经接受并将与您分享的解决方案。

在每个页面的body标签中,我添加了表示控制器和操作的数据元素。然后我有一个文档就绪脚本,它寻找一个以控制器命名的类,其名称为Ready,例如: HomeReady。然后它将在该类上调用一个方法(假设它存在),该方法以该操作命名。所以在你的资产咖啡文件中你可以写:

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

这允许控制权直至行动级别。当我遇到你的问题时,我决定将这个解决方案打包成一个gem,因为我已经在几个项目中使用过它。您可以在https://github.com/intrica/rails_document_ready

找到它

答案 1 :(得分:0)

如果您绝对不希望运行某段初始化代码,除非当前页面是特定的控制器/操作,那么您可以尝试在页面上添加一个空元素,其中包含从该信息构建的ID,如“ posts_index“使用这两个助手:

"#{controller_name}_#{action_name}"

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

编辑:这是我在评论中提到的js partial的一个例子。

<强> show.html.haml

= render 'map'

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

<script src='http://www.google.com/jsapi' type='text/javascript'></script>
<script type='text/javascript'>
  ...
</script>

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