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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top