【问题标题】:How to pass a JavaScript variable in Rails "User.select(...)"如何在 Rails“User.select(...)”中传递 JavaScript 变量
【发布时间】:2020-04-12 22:58:43
【问题描述】:

我有两行代码:

var itemname = document.getElementById("itemname"+x.toString()).value;

var test = JSON.parse('<%= raw Item.select('promCode','baseCode','monadaMe','price','fpa').where(:itemName => 'itemname' ).collect { |p| [p.promCode, p.baseCode, p.monadaMe, p.price, p.fpa] }.join("\n").gsub("\n", " ").split(" ")%>');

我想将我的var itemname 传递给where(:itemName=&gt; 'itemname')

【问题讨论】:

  • JS 在浏览器中执行,而 ruby​​ 仅在服务器上,因此您的查询不能依赖于渲染的 DOM 元素,因为它是在将文件发送到浏览器之前执行的
  • 您可以将带有 AJAX 请求的 itemname 发送到服务器并在控制器中进行查询,从而呈现 JSON

标签: javascript ruby-on-rails ruby ruby-on-rails-6


【解决方案1】:

将变量从运行在客户端的 JavaScript 传递到运行在服务器上的 Rails 的唯一方法是发送 HTTP 请求。

代码在两个完全独立的进程中运行,在不同的机器上和不同的时间。这不仅适用于 rails,还适用于您在服务器上生成 JavaScript 的任何时候——使用任何语言/框架。

您的js.erb 模板首先通过您服务器上的ERB 运行。它只是将其作为字符串缓冲区处理并评估包含的任何 ERB 标记。然后 Rails 将结果发送给实际运行 javascript 的客户端。因此,当代码通过 ERB 运行时,rails 完全不可能知道从一个甚至可能不存在的元素派生的变量的值。

如果您想使用来自服务器的值填充 a 选择,您需要对服务器执行 AJAX request,该服务器返回您用于构建元素的 JSON 或由 js.erb 模板呈现的 javacript,该模板会更改如果您想进一步深入那个兔子洞,请访问页面。

【讨论】:

    【解决方案2】:

    难道你不能使用 JavaScript 的模板文字,使用反引号吗?:

    var test = JSON.parse(`<%= raw Item.select('promCode','baseCode','monadaMe','price','fpa').where(:itemName => '${itemname}' ).collect { |p| [p.promCode, p.baseCode, p.monadaMe, p.price, p.fpa] }.join("\n").gsub("\n", " ").split(" ")%>`);
    

    在 JavaScript 中,您可以在 ${} 中使用反引号 ("``"),就像在 Ruby 中使用双引号 ("") 和 #{} 来插入文本一样。

    所以,在 JavaScript 中:

    const name = 'kostasew';
    const interpolated = `Hi there, ${name}!`;
    
    console.log(interpolated); // prints 'Hi there, kostasew!
    

    您还可以查看“模板文字(模板字符串)1”了解更多信息。

    【讨论】:

    • 在 地方之外工作但在里面我得到 nil 值
    • -1 这基本上是不可能的,因为 ERB 模板是在服务器上呈现的,而 javascript 在客户端上运行。反引号完全无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2021-07-23
    相关资源
    最近更新 更多