【问题标题】:Accessing Javascript variable from ruby从 ruby​​ 访问 Javascript 变量
【发布时间】:2018-06-28 01:46:01
【问题描述】:

将数据从 Ruby 传递到 Javascript 很简单,例如:

<script type="text/javascript">

    function change_value(val){

      alert ("<%= @alert %>")   
      }
    }
</script>

这将发送一个警报,其中包含存储在控制器中警报变量中的数据。

但我不知道它是如何反向工作的,例如,如果我需要将元素 id 存储到控制器变量中:

<script type="text/javascript">

    function change_value(element){
      <% @element_id = *** element.id *** %>

      alert ("<%= @element_id %>")   
      }
    }
</script>

接下来才是真正的交易,由 *** 放弃的代码应该是所需的 javascript 值(@billeable_qts 是一个哈希):

<script type="text/javascript">

  function change_value(product){

    <% @billeable_qts[****product.id****] = ***document.getElementById('product.id').value****  %>
    <% @billeable_qts.each do |key, value| %>
       <% alert = "Key = " + key + ", value: " + value.to_s%>
       alert ("product: <%= alert %>")
    <% end %>


  }

</script>

【问题讨论】:

  • 你想对控制器中的变量做什么?如果你只是想提醒这个值,你可以只使用普通的javascript,它都是客户端function change_value(element) { alert(element.id) }如果你想在控制器中用它做一些事情,例如向数据库中添加一些内容,发送电子邮件。您必须向该控制器操作发送请求,例如function change_value(element) { doPostRequestTo('controller/change_value?value=' + element.id) }
  • 但我不知道它是如何反方向工作的, js 可以向您的 Rails 服务器发送包含您想要的任何信息的请求。该主题称为ajax。 如何访问 javascript“元素”的 id 属性 -- 使用 js 代码,您可以使用元素的 id 检索页面上的任何元素。例如,如果您想在用户单击按钮后发回文本字段的值,那么您的 js 代码可以将 onclick 处理程序函数附加到按钮,该按钮使用(由 rails 插入)@element_id 来检索文本字段的价值。
  • Rails 提供了write ajax code in your views 的方法,但我发现它过于复杂,以至于我只能自己手动编写 js。最重要的是,要成为一名 Web 开发人员,您必须了解很多不同的语言:html、js 和 jQuery,以及像 ruby​​ 和 rails 这样的服务器端语言。至少。
  • 我需要这个,因为我试图用元素 id 和用户值填充散列,只有当用户添加它时,一次可以输入许多值,我需要与这些值交互和标识符。谢谢!!

标签: javascript ruby-on-rails ruby


【解决方案1】:

我假设您指的是嵌入式 Ruby 文件,其扩展名类似于 js.erb。

这些实例变量,例如@element_id,用于生成一个javascript文件然后运行客户端(即在浏览器中)

在这里需要指出的是,变量@element_id 仅用于生成 javascript 文件,然后在创建该 javascript 文件后您基本上可以认为它“消失”了。

这就是为什么您可以将 Ruby 变量值“传递”到 javascript 文件中的原因。但是,当运行客户端时,您不能将 javascript 获得的值传递回这些 Ruby 变量,因为它们基本上不再存在,因为它们的唯一目的是创建 javascript 文件。

因此,用于生成该文件的控制器操作基本上已达到其目的,并且它及其变量等不再可用。

现在,您似乎有一个获取客户端的 javascript 变量,您希望在将其发布到 js 警报之前对其进行操作。

你有两个选择

1) 您可以使用纯 javascript 来操作它。

<script type="text/javascript">

    function change_value(element){
      idToAlert = element.id;
      idToAlert++;
      alert (idToAlert);   
      }
    }
</script>

2) 如果由于某种原因需要根据 Rails 应用程序可以访问的数据库值等内容修改该值,您可以将其发布到控制器和操作,然后将其返回给 javascript。 (注意:我在这里使用 jQuery 库是为了提高效率)

<script type="text/javascript">

function change_value(element){
$.ajax({
  url: "/controller/update_element_id",
  type: "POST",
  data: {"old_element_id": <%= @element_id %>, "new_element_id": element.id},
  success: function(response) {
    alert (response);
  },
  error: function(response) {
    console.log('error: ' + response);
  }
});
}
</script>

Controller#update_element_id 可能是 JS POST 请求的端点,如下所示。

def update_element_id
  item = Model.where(element_id: params["old_element_id"]).first
  item.update_attributes(element_id: params["new_element_id"])
  render json: {element_id: item.element_id}
end

我希望这会有所帮助。很高兴提供任何额外的说明。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多