【问题标题】:Rails -- ERB is ignoring JS / jQueryRails -- ERB 忽略了 JS / jQuery
【发布时间】:2011-07-26 04:50:47
【问题描述】:

我认为下面的代码如下:

<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 if 语句的条件为假,因此不应执行该块。然而由于某种原因,它就像我的 JS 不存在并且正在调用 ERB 块。为什么会这样? JS 似乎在网站上的其他页面上运行良好。

如果您需要更多信息来帮助解决问题,请尽管提出,我会尽力提供尽可能多的信息。

【问题讨论】:

    标签: javascript jquery ruby ruby-on-rails-3 embedded-ruby


    【解决方案1】:

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

    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 领域,您的所有 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) Ruby 调用。

    【讨论】:

    • 非常感谢您的详细回复!所以我现在有点棘手 - 我需要在单击按钮时操作我的数据库(这就是 my_method 所做的)。如果按钮单击是在客户端注册的,我该怎么做,所以 ruby​​ 代码不起作用?
    • @Kvass:可能有点 AJAX。只需设置按钮向/some/new/route 发送AJAX 请求,控制器就会执行my_method(obj) 的操作。
    • 是的,当我使用带有 :remote => true 的 link_to 时它起作用了。感谢您的清晰解释——它帮助很大!
    • @Kvass:做研究和解释事情是我确保我理解正在发生的事情的方式:)
    【解决方案2】:

    ERB 代码是 Ruby 代码,它对 JavaScript 一无所知,if 只是它的标记。如果您不想让执行的 ERB 代码修复 erb 代码中的 if,而不是 JavaScript。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多