Domanda

Ho il seguente codice qui sotto, a mio avviso:

<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>

Come si può vedere dal commento, la condizione per il JavaScript if è falsa, in modo che il blocco non dovrebbe mai essere eseguito. Eppure, per qualche ragione, è come il mio JS non esiste e il blocco ERB viene chiamato. Perché sta succedendo? JS sembra funzionare bene su altre pagine del sito.

Se avete bisogno di più informazioni su questo per aiutare a risolvere il problema chiedere via e cercherò di fornire quante più informazioni possibile.

È stato utile?

Soluzione

ti sembra di essere un po 'confuso circa la differenza tra lato server e il codice lato client.

L'ERB viene eseguito sul server, il JavaScript sul client. Quando è in esecuzione il tuo ERB, Ruby vede praticamente questa:

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

Semplificando un po 'di più, l'ERB si riduce a qualcosa di simile:

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]

Quando si scartare i ERB, diventa abbastanza evidente il motivo per cui è in esecuzione my_method(obj).

In ERB terra, tutto il tuo JavaScript è solo un mucchio di stringhe non interpretati:. Il tuo JavaScript è solo un mucchio di testo senza senso fino a quando si arriva al browser del client

Quindi, il browser vedrà qualcosa di simile:

<script type="text/javascript">    
  $(document).ready(function(){    
    $("#button").click(function(event){
      if(false) {
        $("#button").attr("href","/" + obj.my_path);
      }
    });        
  });
</script>

Il tuo ERB è nulla da vedere, perché è stata gestita sul server. Ma, il vostro if(false) è visto e sarà interpretato dal cliente. Tuttavia, l'ERB ha già eseguito in modo che il if(false) non può influenzare la my_method(obj) Rubino chiamata.

Altri suggerimenti

Il codice di ERB è Rubino il codice, non si sa nulla di Javascript e il caso è solo markup per esso. Se non si desidera avere il codice ERB correzione eseguito il caso all'interno del codice erb, non sul JavaScript.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top