コードを2つの部分に分割すると、理解しやすくなります。
最初の部分$("#reviews").append("<%= ... %>");
は、erbを使用したJavaScriptです。これは、<%= ... %>
がその中のルビコードが返すものに置き換えられることを意味します。その置換の結果は有効なJavaScriptである必要があります。そうでない場合、クライアントが処理しようとするとエラーがスローされます。それが最初のことです。有効なJavaScriptが必要です。。
もう1つ考慮すべきことは、rubyが生成するものはすべて、二重引用符で囲まれたjavascript文字列内に含まれている必要があること<%= ... %>
です。つまり、生成されるJavaScriptは次のようになります。
$("#reviews").append("...");
次に、内のルビ部分を調べてみましょう<%= ... %>
。なにrender(:partial => @review)
ますか?それは部分的なレンダリングです-つまり、それはあらゆる種類のコード-html、css ...またはさらに多くのJavaScriptをレンダリングする可能性があることを意味します!
では、パーシャルにこのような単純なhtmlが含まれているとどうなりますか?
<a href="/mycontroller/myaction">Action!</a>
あなたのjavascriptが二重引用符で囲まれた文字列をパラメータとして取ったことを覚えていますか?を単に<%= ... %>
その部分コードに置き換えると、問題が発生します- href=
二重引用符がある直後!JavaScriptは無効になります:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
これが起こらないようにするには、これらの特殊文字をエスケープして文字列がカットされないようにする必要があります。代わりにこれを生成するものが必要です。
<a href=\"/mycontroller/myaction\">Action!</a>
これは何をescape_javascript
します。返される文字列がJavaScriptを「破壊」しないようにします。これを使用すると、必要な出力が得られます。
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
よろしく!