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