Rails 3.1 和 Coffeescript 出现“找不到变量”错误

IT技术 javascript ruby-on-rails coffeescript
2021-02-21 05:13:38

我的应用程序中有引用我的 application.js 文件的视图,其中包含我在整个应用程序中使用的函数。

在使用了 3.1 的边缘版本后,我刚刚安装了 Rails 3.1 候选版本。在我安装 RC 之前,我没有遇到任何问题,但现在我收到了这个错误:

参考错误:找不到变量:indicator_tag

indicator_tag 是我在 application.js 中定义的一个函数。我在 javascript 文件中注意到的唯一区别是现在我的所有函数都包含在:

(function() { ... }).call(this);

我明白这是用于变量范围?但是它会阻止我的页面使用这些变量吗?在有人问之前,我已经确保我的包含标签中的 javascript 路径是正确的。

2个回答

默认情况下,每个 CoffeeScript 文件都被编译成一个闭包。您不能与来自不同文件的函数交互,除非将它们导出到全局变量。我建议做这样的事情:

在每个咖啡脚本文件的顶部,添加一行

window.Application ||= {}

这将确保始终存在一个全局命名的应用程序。

现在,对于需要从另一个文件调用的每个函数,将它们定义为

Application.indicator_tag = (el) ->
  ...

并使用

Application.indicator_tag(params)
如果可以的话,我会给你 10 ^ s。非常感谢。
2021-04-19 05:13:38
Dogbert 的回答是正确的。(请注意,在这种情况下,您还可以使用this/@将变量导出为全局变量,例如@indicator_id = ...,因为 CoffeeScript 的包装器是在全局上下文中调用的)。您现在刚刚遇到的原因是 Rails 3.1 的早期版本禁用了 CoffeeScript 的包装器。此行为被归类为错误并已针对 RC1 修复:github.com/rails/rails/issues/1125
2021-05-05 05:13:38

如果您有一个非常复杂的 JS 后端,Dogbert 的解决方案是一个很好的方法。但是,如果您只使用少数几个函数,则有一个更简单的解决方案。只需将它们直接添加到 window 对象,就像这样:

window.indicator_tag = (el) ->
  ...

然后您可以从任何地方使用您的函数,而无需将它们包装在另一个对象中。

将它们包装在另一个对象中有什么不好?如果您想避免输入“应用程序”,则将其称为“应用程序”。无论如何,当您只是阅读代码时,上下文通常非常有用……
2021-04-22 05:13:38
而且,我会添加比这个“窗口”。和“@”一样,不是吗?
2021-04-24 05:13:38