有没有办法将javascript变量传递给html.erb中的ruby方法

时间:2015-09-22 19:04:12

标签: javascript ruby-on-rails ruby

我试图将变量传递给方法。这是一个例子:

<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>

任何想法都会受到赞赏。

4 个答案:

答案 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保留在资产管道中