1

私の見解では、以下のコードがあります。

<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 ステートメントの条件は false であるため、ブロックは実行されません。しかし、何らかの理由で、私の JS が存在せず、ERB ブロックが呼び出されているようです。なぜこうなった?JS は、サイトの他のページでは正常に動作しているようです。

問題を解決するためにこれに関する詳細情報が必要な場合は、質問してください。できる限り多くの情報を提供しようとします。

4

2 に答える 2

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

もう少し単純化すると、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はすでに実行されているため、Ruby呼び出しif(false)に影響を与えることはできません。my_method(obj)

于 2011-07-26T08:45:40.733 に答える
0

ERB コードはRubyコードであり、JavaScript については何も知らず、if は単なるマークアップです。ERB コードを実行したくない場合は、JavaScript ではなく、erb コード内の if を修正します。

于 2011-07-26T05:10:46.747 に答える