Frage

Ich habe den folgenden Code unten in meiner Ansicht:

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

Wie Sie im Kommentar sehen können, ist die Bedingung für das JavaScript, wenn die Anweisung falsch ist, sodass der Block niemals ausgeführt werden sollte. Aus irgendeinem Grund ist es jedoch, als ob mein JS nicht existiert und der Erb -Block genannt wird. Warum passiert das? JS scheint auf anderen Seiten auf der Website gut zu funktionieren.

Wenn Sie weitere Informationen dazu benötigen, um das Problem zu lösen, fragen Sie sich und ich werde versuchen, so viele Informationen wie möglich zu liefern.

War es hilfreich?

Lösung

Sie scheinen etwas verwirrt über den Unterschied zwischen serverseitigem und clientseitigem Code zu sein.

Die ERB wird auf dem Server, dem JavaScript im Client, ausgeführt. Wenn Ihre ERB ausgeführt wird, sieht Ruby dies so ziemlich:

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

Die Erb vereinfacht ein bisschen mehr und läuft auf so etwas hinaus:

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]

Wenn Sie die ERB auspacken, wird es ziemlich offensichtlich, warum my_method(obj) wird ausgeführt.

In ERB Land ist Ihr ganzer JavaScript nur eine Reihe von nicht interpretierten Zeichenfolgen: Ihr JavaScript ist nur eine Reihe bedeutungsloser Text, bis es an den Client -Browser gelangt.

Dann wird der Browser so etwas sehen:

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

Ihr ERB ist nirgends zu sehen, weil sie auf dem Server behandelt wurde. Aber dein if(false) wird gesehen und wird vom Kunden interpretiert. Ihr ERB ist jedoch bereits gelaufen, sodass die if(false) kann deine nicht beeinflussen my_method(obj) Ruby Call.

Andere Tipps

Der Erb -Code ist Rubin Code, es weiß nichts über JavaScript und das IF ist nur ein Markup dafür. Wenn Sie nicht den Erb -Code ausgeführt haben möchten, fixieren Sie den IF im Erb -Code, nicht auf dem JavaScript.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top