如何使用资产管道在导轨中导入javascript [英] How to import javascript in rails with asset pipeline
问题描述
在我的应用程序中我有一个控制器支持一个非常复杂的对象,有很多javascript,用coffescript。
我想安排javascript在几个单独的文件,使代码布置得更好,虽然我不知道如何导入这些额外的文件。
例如,我有一个文件 app / assets / javascripts / general_functions.js.coffee
包含以下内容: / p>
#舍入数字
roundNumber =(rnum,rlength = 5) - >
pow = Math.pow(10,rlength)
newnumber = Math.round(rnum * pow)/ pow
parseFloat(newnumber)
#
floorNumber =(rnum,rlength = 5) - >
pow = Math.pow(10,rlength)
newnumber = Math.floor(rnum * pow)/ pow
parseFloat(newnumber)
# str结尾有后缀
endsWith =(str,suffix) - >
str.indexOf(suffix,str.length - suffix.length)!= -1
#返回数字的绝对值(总是> = 0)
abs =(num) - >
if num < 0 then - num else num
如何将其导入我的需要这些功能的资产/ javascripts / projects.js.coffee
我尝试添加
// = require general_functions
到 app / assets / javascripts / application.js
,但没有成功
感谢,
em>我猜想浏览器告诉你,你的 general_functions.js.coffee
函数不存在,你会得到错误,如:
ReferenceError:roundNumber未定义
问题。 CoffeeScript文件的编译版本包装在自动执行的函数中,以防止命名空间污染,因此:
roundNumber =(rnum, rlength = 5) - >
/ pre>
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 = {}
并将您的函数放在其中:
.roundNumber =(rnum,rlength = 5) - >
#...
in my app I have one controller supporting a quite complex object that has a lot of javascript, written in coffescript.
I would like to arrange the javascript on several separate files so to have the code arranged more nicely, although I can't figure out how to import these extra files.
for example I have the file
app/assets/javascripts/general_functions.js.coffee
containing the following:# 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
How do I import it in my
app/assets/javascripts/projects.js.coffee
that needs these functions?I've tried with adding
//= require general_functions
to
app/assets/javascripts/application.js
, with no successany ideas?
thanks,
解决方案By no success I'm guessing that the browser is telling you that none of your
general_functions.js.coffee
functions exist and you're getting errors like:ReferenceError: roundNumber is not defined
You have a simple scoping issue. The compiled version of CoffeeScript files are wrapped in a self-executing function to prevent namespace pollution so this:
roundNumber = (rnum, rlength = 5) -> pow = Math.pow( 10, rlength ) newnumber = Math.round(rnum*pow)/pow parseFloat(newnumber)
looks like this when it gets to the browser:
(function() { var roundNumber; roundNumber = function(rnum, rlength) { // ... }; })();
and all the functions you've defined are hidden. If you want your functions to be global, then define them as
window
properties:window.roundNumber = (rnum, rlength = 5) -> # ...
Or better, you can create an application-specific namespace somewhere before the main (Coffee|Java)Script is loaded:
app = { }
and put your functions in there:
app.roundNumber = (rnum, rlength = 5) -> # ...
这篇关于如何使用资产管道在导轨中导入javascript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!