如何在Slim模板中访问CoffeeScript引擎中的实例变量

时间:2011-11-13 00:00:54

标签: ruby-on-rails ruby-on-rails-3 coffeescript haml slim-lang

我有一个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时会遇到同样的问题。

3 个答案:

答案 0 :(得分:91)

正在发生的事情是"#{@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

答案 1 :(得分:32)

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

在HTML中存储变量的一种很好的方法是使用HTML5数据属性。这是保持您的JavaScript不引人注目的理想选择。

答案 2 :(得分:2)

你也可以使用:

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

这是因为JSON是JavaScript的一个子集。