2

私のアプリケーションでは、安全ではない可能性がある注釈をユーザーに入力させています。ビューでそれらをレンダリングすると、次のように注釈がうまく表示されます。

<%= simple_format h annotation.body %>

改行を保持しますが、HTML も適切にエスケープします。次に、Javascript で作成されたオーバーレイでこのボディをレンダリングする必要があります。現在、コントローラーから次のように呼び出して、JSON を介して注釈を取得しています。

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

そして、次のようなオーバーレイを作成します (非常に単純化された例):

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

もちろん、結果の HTML は適切にエスケープされず、改行も保持されません。


今では、純粋な Javascript を使用してエスケープと改行の変換を行う気はありません。そうすると、あまり DRY を実行しないように感じるからです。保守が難しく、コード全体が雑然としています。

JSON を介してコントローラーから安全な HTML 本文を送信することはできませんか? ERBsimple_formathメソッドはビューでのみ使用できるように見えます。

それとも、本当にJavascriptですべてを行うべきですか?

4

2 に答える 2

1

helpers長い名前で呼び出すだけで、every where を使用できると思います。

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

これを取得したら、動作をカスタマイズModel.to_jsonして、既に解析されたバージョンのModel.body.

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

  1. モデルの Rails 依存関係
  2. モデルにビュー動作を追加する

しかし、これらの問題を回避しようとすると、明確さよりも複雑さが増してしまうことがあります。

于 2012-05-13T11:01:49.303 に答える
0

html の場合と同様に、erb テンプレートから JSON を返すことができます。コントローラーで JSON を返す代わりに、html 応答と同じように、レンダリングを行わずに失敗させます。ビューに index.hmtl.erb という名前を付ける代わりに、index.json.erb という名前を付けます。

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

于 2012-05-13T10:53:16.650 に答える