Rails - ERBはJS / JQueryを無視しています
-
26-10-2019 - |
質問
私の見解では、以下に次のコードがあります。
<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の条件はfalseであるため、ブロックを実行しないでください。しかし、何らかの理由で、それは私の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 ISのマークアップについては何も知りません。 ERBコードを実行したくない場合は、JavaScriptではなく、ERBコード内のIF内部を修正します。