Rails - ERB忽略了JS/jQuery

Kva*_*ass 1 javascript ruby jquery embedded-ruby ruby-on-rails-3

我在下面的代码中有以下代码:

<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>
Run Code Online (Sandbox Code Playgroud)

正如您在注释中看到的那样,JavaScript if语句的条件为false,因此永远不应执行该块.但由于某种原因,它就像我的JS不存在而且正在调用ERB块.为什么会这样?JS似乎在网站上的其他页面上正常工作.

如果您需要有关此问题的更多信息以帮助解决问题,请尽量提供尽可能多的信息.

mu *_*ort 5

您似乎对服务器端代码和客户端代码之间的区别感到有些困惑.

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>'
Run Code Online (Sandbox Code Playgroud)

再简化一点,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]
Run Code Online (Sandbox Code Playgroud)

当您打开ERB时,为什么my_method(obj)要执行它变得非常明显.

在ERB中,你所有的JavaScript都只是一堆未经解释的字符串:你的JavaScript只是一堆无意义的文本,直到它到达客户端浏览器.

然后,浏览器将看到如下内容:

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

您的ERB无处可见,因为它是在服务器上处理的.但是,你if(false)被看到了,它将由客户解释.但是,您的ERB已经运行,因此if(false)不会影响您的my_method(obj)Ruby调用.