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

Ruby on rails 如何在Slim模板中访问CoffeeScript引擎中的实例变量,ruby-on-rails,ruby-on-rails-3,coffeescript,haml,slim-lang,Ruby On Rails,Ruby On Rails 3,Coffeescript,Haml,Slim Lang,我有一个Rails控制器,在其中设置一个实例变量- @user_name = "Some Username" 在我的.slim模板中,我使用coffee引擎生成javascript,并希望从客户端javascript代码打印出用户名- coffee: $(document).ready -> name = "#{@user_name}" alert name 但这就是正在生成的javascript $(document).ready(function() {

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

@user_name = "Some Username"
在我的.slim模板中,我使用coffee引擎生成javascript,并希望从客户端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时也会遇到同样的问题。

发生的事情是,
“{@user\u 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

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

在HTML中存储变量(从javascript中使用)的一种好方法是使用HTML5数据属性。这是保持javascript不引人注目的理想方法。

您还可以使用:

$(document).ready ->
  name = <%= JSON.generate @user_name %>
  alert name
$(文档).ready->
姓名=
警报名称

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

@Thilo不,他正在尝试注入Ruby变量
@user\u name
。Ruby和CoffeeScript使用相同的字符串插值语法。顺便说一句,为什么变量名会从
“{@user\u name}”
变为
this.my\u name
?因为在coffeescript中,@prop被编译成这个.prop类似的问题/解决方案谢谢你的回答,因此,从性能的角度来看,您的建议基本上是可以的?这取决于Slim是否在每次请求时在模板中重新编译CoffeeScript。我真的不确定。无论如何,您可能应该将其移动到外部文件中;然后它只会被编译成JS一次,浏览器会缓存它。如果您使用JavaScript MVC并且希望避免向服务器发出多个HTTP请求,那么这将不会有帮助。如果您使用的是javascriptmvc,那么您通常会执行ajax请求来获取数据,并在客户机上呈现html。但是,例如,您仍然可以在html/body/container.True、True中发送一次性数据属性的常规配置参数。对不起,我太鲁莽了!这东西吐得很厉害。或者至少在Dashing.coffee文件中。