Вы не можете получить доступ к переменным JavaScript внутри тегов ERB.ERB лежит в верхней части сценария.Это означает, что при запросе страницы к серверу Rails он скомпилирует страницу, чтобы интерпретировать ERB.Затем клиенту отправляется простой файл JavaScript или файл HTML.JavaScript будет выполняться на клиенте.
<%= Color.find(bg_color) %>
Запускается на стороне сервера и не имеет доступа к переменной JavaScript bg_color
.
. Простое решение состоит в том, чтобы предоставить всесначала выберите цвета из этого списка.
const colors = <%= Color.pluck(:id, :value).to_h.to_json.html_safe %>;
document.getElementById("tshirt-color").addEventListener("change", function(){
document.getElementById("tshirt-div").style.backgroundColor = colors[this.value];
}, false);
Если вы не хотите указывать все цвета заранее, вам нужно настроить запрос AJAX, который запрашивает сервер при выборе цвета..
Позвольте мне быстро объяснить <%= Color.pluck(:id, :value).to_h.to_json.html_safe %>
.
tmp = Color.pluck(:id, :value) # retrieve the id and value of the colors
#=> [[1, "#fff"], [2, "#000"]]
tmp = tmp.to_h # convert the nested array into a hash
#=> { 1 => "#fff", 2 => "#000" }
tmp = tmp.to_json # convert the hash to a JSON string
#=> '{"1":"#fff", "2":"#000"}'
tmp = tmp.html_safe # mark the string as HTML safe so ERB won't replace characters such as " with "
#=> '{"1":"#fff", "2":"#000"}'
Поскольку JSON - это сокращение от нотации объектов JavaScript, его можно просто прочитать как часть JavaScript.
Кроме того, вы можете вручную создать параметры и предоставить значение цвета через пользовательский атрибут.Например, параметр может выглядеть примерно так:
<option value="1" data-color-value="#fff">White</option>
Затем используйте дополнительный атрибут для установки цвета.
const color = this.options[this.selectedIndex].dataset.colorValue;
document.getElementById("tshirt-div").style.backgroundColor = color;