Rake预编译打破了未定义错误的Javascript

时间:2013-12-21 05:41:53

标签: ruby-on-rails ruby-on-rails-3 angularjs asset-pipeline ng-grid

我正在使用带有Rails的ng-grid并在主页上复制了第一个示例,其中:

<div class="gridStyle" ng-grid="availOptions"></div>
$scope.arr = [{name: "Moroni", age: 50},
                 {name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},
                 {name: "Nephi", age: 29},
                 {name: "Enos", age: 34}]

$scope.availOptions = {
data: 'arr'
}

在资源预编译之前,这很有用。但是在运行之后

$ rake assets:precompile

我们突然得到两张表 - 请参阅http://grab.by/t2dm - 以及错误:

无法调用未定义的方法'selectionHandlers'

我已广泛搜索此问题,但在网上找不到任何其他帮助。所以我想我会在这里发帖,因为我过去几天一直试图调试这个。救命啊!

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:1)

你在开发中运行吗?如果是这样,您几乎肯定需要关闭资产调试。否则,所有脚本和样式表都将被复制,因为您将获得连接/缩小版本和未编译版本。

问题在于javascript_include_tag "application.js"

基本上,在开发过程中,它会扩展到如下所示的一堆行:

<script src="application.js?body=1"></script>
<script src="my-file1.js?body=1"></script>
<script src="my-file2.js?body=1"></script>
... etc ...

在生产中,关闭资产调试后,您会看到单个连接文件及其资产管道指纹:

<script src="application.js-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.js"></script>

问题是,在开发过程中,一旦您编译了首先application.js?body=1包含所有脚本的资产。但随后的行中第二次包含脚本。

查看您网站的来源;如果你有一个<script src="application-xxxxxxxx.js"></script>,那么资产调试就会关闭,这个答案就没用了。如果每个源文件有一个<script>,则启用资产调试,并且每个脚本都会运行两个副本。

当您预编译资产时,这种情况经常发生,但在开发环境中继续运行您的应用程序,默认情况下,资产调试处于启用状态。开发环境和预编译资产兼容;一旦你预编译了资产,就需要杀死你的服务器并用RAILS_ENV=production重启它,假设你的开发副本已经设置了一个合理的伪生产配置。