2012-05-13 98 views
2

在我的應用程序中,我讓用戶輸入可能不安全的註釋。當我在我看來使它們,下面顯示了很好的註解:將HTML從控制器傳遞給Javascript的正確方法是什麼?

<%= 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做轉義和換行轉換,因爲它的感覺就像我不會幹燥很多,如果我這樣做了。看起來很難維護和混亂整個代碼。

無法以某種方式通過JSON從控制器發送安全的HTML正文?看起來好像ERB simple_formath方法僅在視圖中可用。

或者我應該真的在JavaScript中做所有事情?

回答

1

我想你可以使用helpers每一個地方只是它們的長名字美其名曰:

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

一旦你有了這個,你可以customize your Model.to_json behavior包括已解析的版本的。

當然也有兩個問題的方法:在你的模型

  • 添加視圖行爲模型
    1. Rails的依賴,但有時試圖避免這些問題,帶來的是更多的比清晰度更復雜。

    +0

    這工作得很好,我只是在渲染之前將代碼添加到'format.json'塊中。它現在在控制器中,但仍然比在JS中做得更好。 – slhck

    0

    您可以像使用html一樣從erb模板返回JSON。不要在控制器中返回JSON,而應該像HTML響應一樣不要渲染。而不是命名視圖index.hmtl.erb,將其命名爲index.json.erb。

    我不確定這是最乾淨的方式。這是Rails爲響應html或其他提供simple_format的唯一方式。

    相關問題