如何在带有资产管道的rails中导入javascript

时间:2013-07-17 14:35:17

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

在我的应用程序中,我有一个控制器支持一个非常复杂的对象,它有很多javascript,用coffescript编写。

我想在几个单独的文件上安排javascript,以便更好地安排代码,虽然我无法弄清楚如何导入这些额外的文件。

例如,我的文件app/assets/javascripts/general_functions.js.coffee包含以下内容:

# rounds a number
roundNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.round(rnum*pow)/pow
  parseFloat(newnumber)

# floors a number
floorNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.floor(rnum*pow)/pow
  parseFloat(newnumber)

# returns true if the str ends with suffix
endsWith = (str, suffix) ->
  str.indexOf(suffix, str.length - suffix.length) !=   -1

# returns the absolute value of a number (always >= 0)
abs = (num) -> 
  if num < 0 then - num else num

如何在我需要这些功能的app/assets/javascripts/projects.js.coffee中导入它?

我尝试添加

//= require general_functions

app/assets/javascripts/application.js,没有成功

任何想法?

谢谢,

3 个答案:

答案 0 :(得分:1)

没有成功我猜测浏览器告诉您没有general_functions.js.coffee个函数存在,并且您收到的错误如下:

  

ReferenceError:未定义roundNumber

您有一个简单的范围问题。 CoffeeScript文件的编译版本包含在一个自动执行的函数中,以防止命名空间污染,所以:

roundNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.round(rnum*pow)/pow
  parseFloat(newnumber)
当它到达浏览器时

看起来像这样:

(function() {
  var roundNumber;
  roundNumber = function(rnum, rlength) {
    // ...
  };
})();

并隐藏了您定义的所有功能。如果您希望您的函数是全局函数,请将它们定义为window属性:

window.roundNumber = (rnum, rlength = 5) ->
  # ...

或者更好的是,您可以在加载main(Coffee | Java)脚本之前的某个位置创建特定于应用程序的命名空间:

app = { }

并将你的功能放在那里:

app.roundNumber = (rnum, rlength = 5) ->
  # ...

答案 1 :(得分:0)

Javascript应该自动包含在您的rails应用程序中,每个控制器都有自己的js文件。使用下面的说明将包含它们。

您的app/assets/javascripts/application.js.coffee应该包含以下内容:

#= require_tree .

app/assets/javascripts/application.js(普通javascript):

//= require_tree .

当您在浏览器中查看页面来源时,您会看到类似的内容:

<script src="/assets/projects.js?body=1"></script>

您所描述的是具有通用功能的帮助器或更全局的js文件。您可以将这些添加到application.js。此外,使用如下结构将包括vendor / assets / javascripts / some_generic_feature.js(.coffee)

//= require some_generic_feature

答案 2 :(得分:0)

application.js中按正确顺序添加两个文件:

的application.js

//= require general_functions
//= require projects

希望这有帮助!