Как передать переменную JavaScript в Rails "User.select (...)" - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть две строки кода:

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').

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Единственный способ передать переменную из JavaScript, работающей на клиенте, в Rails, работающую на сервере, - это отправить HTTP-запрос.

Код выполняется в двух совершенно разных процессах, на разных машинах и в разное время. Это относится не только к rails, но и в любое время, когда вы генерируете JavaScript на сервере - на любом языке / фреймворке.

Ваш шаблон js.erb сначала запускается через ERB на вашем сервере. Который просто обрабатывает его как строковый буфер и оценивает любые содержащиеся в нем теги ERB. Затем Rails отправляет результат клиенту, который на самом деле запускает javascript. Таким образом, для rails невозможно узнать значение переменной, полученной из элемента, который может даже не существовать, когда код выполняется через ERB.

Если вы хотите заполнить a select значениями из вашего сервер, вам нужно сделать AJAX запрос к серверу, который либо возвращает JSON, который вы используете для построения элементов, либо javacript, представленный шаблоном js.erb, который изменяет страницу, если вы хотите go дальше по этой кроличьей норе.

0 голосов
/ 13 апреля 2020

Не могли бы вы использовать шаблонные литералы 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"для получения дополнительной информации.

...