Question

Je le code suivant ci-dessous à mon avis:

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

Comme vous pouvez le voir par le commentaire, la condition du JavaScript si la déclaration est fausse, de sorte que le bloc ne doit jamais être exécuté. Pourtant, pour une raison quelconque, il est comme mon JS n'existe pas et le bloc ERB est appelé. Pourquoi cela arrive-t-il? JS semble fonctionner correctement sur d'autres pages du site.

Si vous voulez plus d'infos sur ce pour aider à résoudre le problème demande loin et je vais essayer de fournir autant d'informations que je peux.

Était-ce utile?

La solution

Vous semblez être un peu confus au sujet de la différence entre côté serveur et le code côté client.

Le ERB est exécuté sur le serveur, le JavaScript sur le client. Lorsque votre ERB est en cours d'exécution, Ruby voit assez bien ceci:

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

Simplifier un peu plus, l'ERB se résume à quelque chose comme ceci:

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]

Lorsque vous déballez l'ERB, il devient assez évident pourquoi my_method(obj) est en cours d'exécution.

Dans la terre ERB, toute votre JavaScript est juste un tas de cordes non interprétés. Votre JavaScript est juste un tas de texte vide de sens jusqu'à ce qu'il atteigne le navigateur client

Ensuite, le navigateur voir quelque chose comme ceci:

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

Votre ERB est visible nulle part parce qu'il a été traité sur le serveur. Mais, votre if(false) est vu et il sera interprété par le client. Cependant, votre ERB a déjà exécuté de sorte que le if(false) ne peut pas affecter votre my_method(obj) Ruby appel.

Autres conseils

Le code ERB est Ruby code, il ne sait rien sur JavaScript et si est markup juste pour elle. Si vous ne voulez pas avoir le code ERB fixe exécuté le si à l'intérieur du code Erb, pas sur le JavaScript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top