如何在 Rails "User.select(...)" 中传递 JavaScript 变量

How to pass a JavaScript variable in Rails "User.select(...)"

我有两行代码:

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=> 'itemname')

你不能使用 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 中,您可以在 ${} 中使用反引号 ("``"),就像在 #{} 中使用双引号 ("") 一样=28=] 插入文本。

因此,在 JavaScript 中:

const name = 'kostasew';
const interpolated = `Hi there, ${name}!`;

console.log(interpolated); // prints 'Hi there, kostasew!

您还可以查看 "Template literals (Template strings)1" 了解更多信息。

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

代码 运行 在两个完全独立的进程中,在不同的机器上,在不同的时间。这不仅适用于 rails,而且任何时候您在服务器上生成 JavaScript - 在任何 language/framework.

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

如果您想用您服务器的值填充 select,您需要对您使用的 returns JSON 服务器执行 AJAX request构建由 js.erb 模板呈现的元素或 javacript,如果您想深入那个兔子洞,它会改变页面。