Rails - Erb игнорирует JS / jQuery
-
26-10-2019 - |
Вопрос
У меня есть следующий код ниже, в моем представлении:
<script type="text/javascript">
$(document).ready(function(){
$("#button").click(function(event){
if(false) { //even with if (false), this code is still being executed!
<% if obj %>
<% my_method(obj) %>
<% end %>
$("#button").attr("href","/" + obj.my_path);
}
});
});
</script>
Как вы можете видеть в комментарии, условие для JavaScript, если оператор является ложным, поэтому блок никогда не должен выполняться. Тем не менее, по какой -то причине, как будто мой JS не существует, и блок ERB называется. Почему это происходит? JS, кажется, отлично работает на других страницах на сайте.
Если вам нужна дополнительная информация об этом, чтобы помочь решить проблему, и я постараюсь предоставить как можно больше информации.
Решение
Вы, кажется, немного смущены в разнице между серверной и клиентской кодом.
ERB выполняется на сервере, JavaScript на клиенте. Когда ваш ERB выполняется, Ruby в значительной степени видит это:
puts '<script type="text/javascript">'
puts ' $(document).ready(function(){'
puts ' $("#button").click(function(event){'
puts ' if(false) {'
if obj
my_method(obj)
end
puts ' $("#button").attr("href","/" + obj.my_path);'
puts ' }'
puts ' });'
puts ' });'
puts '</script>'
Упрощение немного больше, ERB сводится к чему -то подобному:
puts some_strings[0]
puts some_strings[1]
puts some_strings[2]
puts some_strings[3]
if obj
my_method(obj)
end
puts some_strings[4]
puts some_strings[5]
puts some_strings[6]
puts some_strings[7]
puts some_strings[8]
Когда вы разворачиваете ERB, становится совершенно очевидным, почему my_method(obj)
выполняется.
В Erb Land весь ваш JavaScript - это всего лишь куча неинтерпретированных струн: ваш JavaScript - это просто куча бессмысленного текста, пока он не дойдет до клиентского браузера.
Затем браузер увидит что -то вроде этого:
<script type="text/javascript">
$(document).ready(function(){
$("#button").click(function(event){
if(false) {
$("#button").attr("href","/" + obj.my_path);
}
});
});
</script>
Ваш ERB нигде не видно, потому что он был обработан на сервере. Но твой if(false)
видно и будет интерпретироваться клиентом. Однако ваш ERB уже работал, так что if(false)
не может повлиять на ваш my_method(obj)
Рубиновый звонок.
Другие советы
Код ERB Рубин Код, он ничего не знает о JavaScript и if просто наценке для него. Если вы не хотите выполнять выполненный код ERB, исправьте IF внутри кода ERB, а не на JavaScript.