Вопрос

У меня есть следующий код ниже, в моем представлении:

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

Как вы можете видеть в комментарии, условие для JavaScript, если оператор является ложным, поэтому блок никогда не должен выполняться. Тем не менее, по какой -то причине, как будто мой JS не существует, и блок ERB называется. Почему это происходит? JS, кажется, отлично работает на других страницах на сайте.

Если вам нужна дополнительная информация об этом, чтобы помочь решить проблему, и я постараюсь предоставить как можно больше информации.

Это было полезно?

Решение

Вы, кажется, немного смущены в разнице между серверной и клиентской кодом.

ERB выполняется на сервере, JavaScript на клиенте. Когда ваш ERB выполняется, Ruby в значительной степени видит это:

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

Упрощение немного больше, ERB сводится к чему -то подобному:

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]

Когда вы разворачиваете ERB, становится совершенно очевидным, почему my_method(obj) выполняется.

В Erb Land весь ваш JavaScript - это всего лишь куча неинтерпретированных струн: ваш JavaScript - это просто куча бессмысленного текста, пока он не дойдет до клиентского браузера.

Затем браузер увидит что -то вроде этого:

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

Ваш ERB нигде не видно, потому что он был обработан на сервере. Но твой if(false) видно и будет интерпретироваться клиентом. Однако ваш ERB уже работал, так что if(false) не может повлиять на ваш my_method(obj) Рубиновый звонок.

Другие советы

Код ERB Рубин Код, он ничего не знает о JavaScript и if просто наценке для него. Если вы не хотите выполнять выполненный код ERB, исправьте IF внутри кода ERB, а не на JavaScript.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top