我试图将变量传递给方法。这是一个例子:
<script>
var b = 1
var c = "string" + "<%= method.a(b).to_s%>"
</script>
哪个不起作用。
这有效:
<% @b = 1%>
<script>
var c = "string" + "<%= method.a(@b).to_s%>"
</script>
任何想法都会受到赞赏。
答案 0 :(得分:1)
有一个很好的宝石gon来执行这项工作。使用这个gem你可以这样做:
内部控制器:
gon.variable_name
在js文件中,您可以检索此变量:
Test t = Test new Test();//the problem with this statement
<%
Test t = new Test();//should be, object will be created
t.test();
%>
它正在为:js或:咖啡文件工作。
答案 1 :(得分:1)
您无法在Ruby方法中评估JavaScript变量。此外,您当前的脚本必须位于资产管道之外,这通常是一种不好的做法。
一个简单的解决方案是将变量作为数据属性传递。您将运行您的方法,然后在加载DOM后使用jQuery传递结果。这允许您将JavaScript保留在资产管道中并将其传递给Ruby服务器端评估的数据。
注意:应在您的控制器上定义@b
:
<div id="foo" data-bar="<%= method.a(@b).to_s %>"></div>
<script>
$(document).ready(function() {
var b = $(#foo).data('bar');
var c = "string" + b;
});
</script>
另一个选项是在Rails中使用unobtrusive JavaScript异步呈现脚本。
答案 2 :(得分:0)
Ruby代码在服务器上执行,而Javascript由客户端的浏览器执行。
由<%= %>
标记的Ruby代码在服务器处执行,然后传递到客户端,其中将执行Javascript代码。这就是为什么第一个代码段不起作用而第二个代码段的原因:在第二个代码段中,{<1}}在向请求者发送HTML之前评估。
话虽如此,有一种方法可以做你想做的事情:use Ajax将Javascript变量传递给服务器,执行你需要的任何内容并将回复发回客户端。
答案 3 :(得分:0)
您需要更好地描述您的流程。
案例1:变量的值由用户操作决定。然后对rails对象方法进行ajax调用,以获得js的计算值。
案例2:变量的值由app(服务器端)确定。然后你可以这样做:
<% @b = 1%>
<script>
var b = <%= @b %>;
var c = "string" + "<%= method.a(@b).to_s%>";
</script>
JS和服务器方法可以使用相同的值。 但这不是一个干净的方法。视图不应设置值。
另外,按照@ jeffD23
的建议,将js保留在资产管道中