2010-11-01 17 views
4

我的模型中有一個描述文本字段。不,我想在展示頁面上添加這個描述。 但是由於沒有換行符,文本呈現醜陋。轉義HTML輸出但沒有換行符

如果我將它們替換爲<br/>,那麼導軌就會使用。 所以我嘗試使用raw()方法。 我想轉義錯誤的HTML,但在輸出中有換行符。

我結束了一些醜陋的代碼。

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>")) 

你有什麼建議嗎?

回答

2

是你在找什麼

@place.description.html_safe.gsub("\n", '<br/>') 

?但第二個想法是,這樣的使用不會使網站容易受到XSS攻擊嗎? (因爲它假定description是安全的)。

所以不會更好的解決方案是

<%= (h @place.description).gsub("\n", '<br/>') %> 

起初我以爲是必要

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %> 

,但實際上這兩種版本。然後我通過在description中添加一些HTML標籤進行測試,並將它轉義爲&lt;等,因此它可以防止XSS攻擊。

+0

這不工作。 – 2013-01-28 06:45:49

+0

我在下面發佈了我的解決方案。 – 2013-01-28 06:51:59

1

這裏是一個有效的解決方案:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %> 

更多閱讀:

Parsing newline characters in textareas without allowing all html tags

文檔:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

從sanitize方法:

這sanitize方法助手將HTML編碼的所有的標籤和剝離未明確允許的所有屬性。

它還會去除帶有無效協議的href/src標記,如javascript:尤其如此。它盡最大努力來對付黑客可能使用的任何技巧,例如拋出unicode/ascii/hex值以通過javascript:過濾器。查看大量的測試套件。

您可以使用:tags選項指定允許的標籤,並使用attributes選項指定屬性。

2

3年後,但它永遠不會太晚,提供一個良好的工作解決方案

這將逃避所有HTML字符,但換行符(兼容的Linux,Windows和Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe 
+0

謝謝百萬 – 2017-03-14 11:41:08