51

我有一个 Rails 控制器,我在其中设置一个实例变量 -

@user_name = "Some Username"

在我的 .slim 模板中,我使用咖啡引擎生成 javascript 并希望从客户端 sie javascript 代码中打印出用户名 -

coffee:
  $(document).ready ->
    name = "#{@user_name}"
    alert name

但这是正在生成的javascript?

$(document).ready(function() {
    var name;
    name = "" + this.my_name;
    alert(name);
}

如何在我的 CoffeeScript 代码中访问控制器实例变量?

我将其标记为 haml 因为我猜 haml 在使用 CoffeeScript 时会遇到同样的问题。

4

3 回答 3

93

正在发生的事情是"#{@user_name}"被解释为 CoffeeScript,而不是被评估并注入到 CoffeeScript 源中的 Ruby 代码。您在问,“如何将 Ruby 变量注入到我的 CoffeeScript 源代码中?”

简短的回答是:不要这样做。Rails 团队有意决定在 3.1 的模板中不支持嵌入的 CoffeeScript,因为必须在每个请求上编译 CoffeeScript 都会产生巨大的性能开销(如果您允许将任意字符串注入源代码,您必须这样做) .

我的建议是将您的 Ruby 变量作为纯 JavaScript 单独提供,然后从您的 CoffeeScript 中引用这些变量,例如:

javascript:
  user_name = "#{@user_name}";
coffee:
  $(document).ready ->
    name = user_name
    alert name
于 2011-11-13T00:34:45.400 回答
32

我倾向于不惜一切代价避免使用内联 javascript。

在您的 HTML 中存储变量以从您的 javascript 中使用的一种好方法是使用 HTML5 数据属性。这是保持您的 javascript 不显眼的理想选择。

于 2011-11-13T14:12:58.390 回答
2

您还可以使用:

$(document).ready ->
  name = <%= JSON.generate @user_name %>
  alert name

这是因为JSON是 JavaScript 的子集。

于 2012-09-12T21:44:32.330 回答