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

kap*_*pso 50 haml ruby-on-rails coffeescript ruby-on-rails-3 slim-lang

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

@user_name = "Some Username"
Run Code Online (Sandbox Code Playgroud)

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

coffee:
  $(document).ready ->
    name = "#{@user_name}"
    alert name
Run Code Online (Sandbox Code Playgroud)

但这是正在生成的JavaScript?

$(document).ready(function() {
    var name;
    name = "" + this.my_name;
    alert(name);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tre*_*ham 92

正在发生的事情是"#{@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
Run Code Online (Sandbox Code Playgroud)

  • 这取决于Slim是否在每个请求中重新编译模板中的CoffeeScript.老实说,我不确定.你应该将它移动到外部文件中; 那么它只会编译成JS一次,浏览器会缓存它. (2认同)

nat*_*vda 32

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

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