Rails资产管道中的自定义coffeescript

时间:2013-01-25 15:49:25

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

我在app / assets / javascripts / custom.js中创建了一个带有函数定义的小型自定义javascript文件

round_number = function(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
};

该应用程序正常,因为该文件已插入资产管道中。 然后,出于学习目的,我将其转换为coffescript:

round_number = (num, dec) ->
  Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec)

但令我惊讶的是,应用程序无效。 我检查了localhost:3000 / assets / custom.js,coffescript被翻译成:

(function() {
  var round_number;

  round_number = function(num, dec) {
    return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
  };

}).call(this);

为什么额外的换行,使得函数在我需要的地方不可用?

如果我不在custom.js.coffee文件中插入coffescript函数,而是在app / assets / javascripts / orders.js.coffee(其中Order是我的类)中,它将被转换为预期的javascript。

我想将共享的javascript函数放在一个单独的文件中,因为它更有序。 我知道,即使我把这个函数放在orders.js.coffee中,它也可以在整个应用程序中使用(这就是我想要完成的),但我很困惑。 我在这里缺少最佳实践吗?

---编辑---

我从"Can't find variable" error with Rails 3.1 and Coffeescript了解

我认为我将以这种方式组织我的Rails应用程序:

1)创建一个文件app / assets / javascripts / global.js.coffee以包含所有全局变量和函数。在这个文件中放一行

window.Global ||= {}

定义命名空间Global。将功能定义为

Global.function_name = (arguments) ->
  ...

2)用以下方法调用函数:

Global.function_name(arguments)

1 个答案:

答案 0 :(得分:0)

是的,如果您想要全局可用的内容,请将其设置为window上的属性。 Coffeescript编译器将您的代码包装在一个匿名函数中,以防止意外的名称冲突。