コードを2つに分割すると分かりやすくなります。
最初の部分$("#reviews").append("<%= ... %>");
はerbでjavascriptです。つまり、<%= ... %>
は、その内部のルビコードが何であっても置き換えられます。その置換の結果は有効なjavascriptでなければなりません。それ以外の場合、クライアントがそれを処理しようとするとエラーがスローされます。これが最初のことです:有効なjavascriptが必要です。
ルビが生成するものは、二重引用符で囲んだjavascript文字列内に含める必要があります。<%= ... %>
の前後に二重引用符があることに注意してください。
$("#reviews").append("...");
が今度は<%= ... %>
内ルビーの一部を調べてみましょう:これは、生成されたJavaScriptは次のようになりますことを意味します。 render(:partial => @review)
は何をしますか?これは、部分的なレンダリングです。つまり、あらゆる種類のコードをレンダリングすることができます。つまり、html、css、またはさらに多くのjavascriptをレンダリングすることができます。
私たちの部分にこのような単純なHTMLが含まれているとどうなりますか?
<a href="/mycontroller/myaction">Action!</a>
JavaScriptは二重引用符で囲まれた文字列をパラメータとして使用していたことを覚えていますか? <%= ... %>
を部分的なコードに置き換えただけの場合は、問題があります。href=
の直後に二重引用符があります。
<a href=\"/mycontroller/myaction\">Action!</a>
: - :JavaScriptが有効ではありません、あなたは代わりに、これを生成何かが必要
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
この現象が発生しないためには、あなたの文字列がカットされていないので、あなたはエスケープこれらの特殊文字にしたいです
これは何ですか?escape_javascript
です。それは返された文字列がjavascriptを "中断"しないことを保証します。あなたがそれを使用する場合は、希望の出力を得るでしょう:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
よろしく!
参考になった回答は正解ではありません。 Kikitoは – Steve