2012-01-21 8 views
0

でHTMLを生成した場所:レール3 - 部分のエスケープは、私は単純なことをやろうとしていますjavascriptの応答

_flash.js.erb:

$("#alerts").append("<%=j render :template => "shared/_flash.html.erb" %>"); 

注<% = J ..これはjavascriptをエスケープします。

_flash.html.erb:_flash.js.erbが呼び出されると

<% flash.each do |key, value| %> 
    <div class="alert-message top <%= "#{key}" %> fade in" data-alert="alert"> 
    <a class="close" href="#">x</a> 
    <p><%=j value %></p> 
    </div> 
<% end %> 

、しかし、次のようなものが追加されます:

$("#alerts").append(" \u003Cdiv class=alert-message top warning fade in data-alert=alert\u003E 
    \u003Ca class=close href=#\u003Ex\u003C/a\u003E 
    \u003Cp\u003ELooks like you have already linked with Facebook.\u003C/p\u003E 
    \u003C/div\u003E 
"); 

JavaScriptをエスケープせず、応答は次のようになります。

$("#alerts").append(" <div class="alert-message top warning fade in" data-alert="alert"> 
    <a class="close" href="#">x</a> 
    <p>Looks like you have already linked with Facebook.</p> 
    </div> 
"); 

最初のresp onse、あまりにも多くのものはエスケープされます。 2番目のレスポンスでは、何もエスケープされず、二重引用符は物事を混乱させます。

上記を堅牢な方法で実現するには、どのような方法でレール3をお勧めしますか?

+0

したがって、<%=j .. %>の代わりにescape_javascript(...)を使用すると、望ましい結果が得られることが判明しました。奇妙な - 彼らは同じことだと思った。私はもっ​​と冗長で解決しなければならないと思う。それほど冗長でない方法や、<%=j ... %>を動作させる方法はありますか? – deruse

答えて

3

代わりにescape_javascriptを使用してください。あなたはJSON-escapingです。

jjson_escapeの別名です。それはちょうどヘルパーです。

+0

誰かがこれらのドキュメントを修正する必要があります--http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript – deruse

関連する問題