【问题标题】:Is there a way to pass javascript variable into ruby method in html.erb有没有办法将 javascript 变量传递给 html.erb 中的 ruby​​ 方法
【发布时间】:2015-09-22 19:04:11
【问题描述】:

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

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

任何想法都将不胜感激。

【问题讨论】:

标签: javascript ruby-on-rails ruby


【解决方案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】:

    有一个很好的宝石gon 可以完成这项工作。使用这个 gem,你可以这样做:

    内部控制器:

    gon.push(variable_name: 1)
    

    在您的 js 文件中,您可以检索此变量:

    gon.variable_name 
    

    它适用于 :js 或 :coffee 文件。

    【讨论】:

    • gon 将 rails 变量传递给 js。但是 OP 想将 js 变量传递给 ruby​​。
    【解决方案3】:

    Ruby 代码在服务器上执行,而 Javascript 由客户端的浏览器执行。

    &lt;%= %&gt; 标记的 Ruby 代码在服务器上执行,然后然后传送到客户端,在那里执行 Javascript 代码。这就是为什么第一个 sn-p 不起作用而第二个起作用的原因:在第二个 sn-p 中,&lt;% @b = 1 %&gt;向请求者发送 HTML 之前被评估。

    话虽如此,有一种方法可以做你想做的事:use Ajax 将 Javascript 变量传递给服务器,执行你需要的任何内容并将答案发送回客户端。

    【讨论】:

      【解决方案4】:

      您需要更好地描述您的流程。

      案例1:变量的值由用户操作决定。然后对rails对象方法进行ajax调用,将计算的值传给js。

      案例2:变量的值由app(服务器端)决定。然后你可以这样做:

      <% @b = 1%>
      <script>
         var b = <%= @b %>;
         var c = "string" + "<%= method.a(@b).to_s%>";
      </script>
      

      相同的值将可用于 JS 和服务器方法。 但这不是一个干净的方法。视图不应设置该值。

      此外,按照@jeffD23 的建议,将 js 保留在资产管道中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 2023-04-10
        • 2018-01-26
        • 2021-11-26
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多