ruby on rails-如何在Slim temp内访问CoffeeScript引擎中的实例变量

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

@user_name = "Some Username"

在我的.slim模板中,我正在使用Coffee Engine生成javascript,并希望从client-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个解决方案
92 votes

发生的是"#{@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
Trevor Burnham answered 2020-01-23T20:55:57Z
32 votes

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

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

nathanvda answered 2020-01-23T20:56:22Z
2 votes

您还可以使用:

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

这是因为JSON是JavaScript的子集。

gene tsai answered 2020-01-23T20:56:46Z
translate from https://stackoverflow.com:/questions/8108511/how-to-access-instance-variables-in-coffeescript-engine-inside-a-slim-template