2012-05-13 17 views
2

私のアプリケーションでは、潜在的に危険な注釈をユーザーに入力させました。私は私の見解でそれらをレンダリングするときは、次のようにきれいに注釈を示していますコントローラからJavascriptにHTMLを渡す適切な方法は何ですか?

<%= simple_format h annotation.body %> 

これは、改行を維持するだけでなく、適切にHTMLをエスケープします。今、私はJavascriptで作成されたオーバーレイでこのボディをレンダリングする必要があります。うもちろん

$.getJSON(this.annotations_url, function(data) { 
    $.each(data, function(key, val) { 
     annotation = val; 
     this.div_body.html(annotation.body); 
     // ... 

、結果のHTML:

def index 
    # ... 
    respond_to do |format| 
    format.json { render :json => @annotations } 
    end 
end 

そして、この(非常に単純化した例)のようなオーバーレイを作成:今、私は、コントローラから、次を呼び出すことにより、JSONを通じて私の注釈をフェッチではなくを適切にエスケープし、改行も保存しません。今


私は多くのことを、乾燥されないように、私はそのようにした場合、それは感じているので、私はエスケープと改行変換を行うために、純粋なJavascriptを使用してのように感じることはありません。コード全体を維持管理するのは難しいようです。

コントローラーから安全なHTML本体を何とかJSON経由で送信できませんか? ERB simple_formathのメソッドは、ビューでのみ使用できるように見えます。

本当にJavascriptですべてを行う必要がありますか?

答えて

1

私はちょうど彼らの長い名前によってそれらを呼び出すどこがすべてのhelpersを使用することができると思う:既に解析されたバージョンが含まれるようにあなたがこれをしたら、あなたがcustomize your Model.to_json behaviorでき

ActionController::Base.helpers.simple_format str
ERB::Util:: html_escape str

  1. あなたのモデルでRailsの依存関係
  2. あなたのモデルに

を見るの振る舞いを追加するしかし、時には、これらの問題を避けるためにしようとすると、より多くをもたらしている。

もちろん、このアプローチには2つの問題があります複雑さよりも複雑です。

+0

これはかなりうまくいきました。コードをレンダリングする前に 'format.json'ブロックに追加しました。それは今コントローラーに入っていますが、JSでやっているよりも優れています。 – slhck

0

あなたはhtmlの場合と同じように、erbテンプレートからJSONを返すことができます。コントローラーでJSONを返す代わりに、HTMLレスポンスのようにレンダリングを行わないようにします。 index.hmtl.erbビューに名前を付ける代わりに、index.json.erbという名前を付けます。

私はそれが最もクリーンな方法であるかどうかはわかりません。これは、Railsがhtmlやその他の応答に対してsimple_formatを提供した唯一の方法です。

関連する問題