Rails - Erb está ignorando JS / jQuery
-
26-10-2019 - |
Pregunta
Tengo el siguiente código a continuación en mi opinión:
<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>
Como puede ver por el comentario, la condición para JavaScript si la declaración es falsa, por lo que el bloque nunca debe ejecutarse. Sin embargo, por alguna razón, es como si mi JS no existiera y se llama el bloque ERB. ¿Por qué está pasando esto? JS parece funcionar bien en otras páginas del sitio.
Si necesita más información sobre esto para ayudar a resolver el problema, pregunte e intentaré proporcionar tanta información como pueda.
Solución
Parece estar un poco confundido sobre la diferencia entre el código del lado del servidor y el código del lado del cliente.
El ERB se ejecuta en el servidor, el JavaScript en el cliente. Cuando tu ERB está siendo ejecutado, Ruby ve esto:
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>'
Simplificando un poco más, el ERB se reduce a algo como esto:
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]
Cuando desenvuelve el ERB, se vuelve bastante obvio por qué my_method(obj)
está siendo ejecutado.
En Erb Land, todo su JavaScript es solo un montón de cuerdas no interpretadas: su JavaScript es solo un montón de texto sin sentido hasta que llega al navegador del cliente.
Entonces, el navegador verá algo como esto:
<script type="text/javascript">
$(document).ready(function(){
$("#button").click(function(event){
if(false) {
$("#button").attr("href","/" + obj.my_path);
}
});
});
</script>
Su ERB no se puede ver en ninguna parte porque se manejó en el servidor. Pero tu if(false)
se ve y será interpretado por el cliente. Sin embargo, tu ERB ya ha ejecutado, así que el if(false)
no puede afectar su my_method(obj)
Llamada de Ruby.
Otros consejos
El código ERB es Rubí Código, no sabe nada sobre JavaScript y el IF es solo marcado para ello. Si no desea que se ejecute el código ERB, arregle el IF IF del código ERB, no en el JavaScript.