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

我有一个Rails控制器,我正在设置一个实例variables –

@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代码中访问控制器实例variables?

我把这个标记为haml,因为我猜测haml在使用CoffeeScript时会遇到同样的问题。

发生了什么事是"#{@user_name}"被解释为CoffeeScript,而不是被评估和注入到CoffeeScript源代码中的Ruby代码。 你问:“我怎么注入一个Rubyvariables到我的CoffeeScript源?

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

我的build议是将你的Rubyvariables分别作为纯JavaScript来提供,然后从你的CoffeeScript中引用这些variables,例如:

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

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

在HTML中存储variables的一个好方法是使用HTML5数据属性。 这是保持你的javascript不显眼的理想select。

你也可以使用:

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

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