我的模型中有一個描述文本字段。不,我想在展示頁面上添加這個描述。 但是由於沒有換行符,文本呈現醜陋。轉義HTML輸出但沒有換行符
如果我將它們替換爲<br/>
,那麼導軌就會使用。 所以我嘗試使用raw()方法。 我想轉義錯誤的HTML,但在輸出中有換行符。
我結束了一些醜陋的代碼。
raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))
你有什麼建議嗎?
我的模型中有一個描述文本字段。不,我想在展示頁面上添加這個描述。 但是由於沒有換行符,文本呈現醜陋。轉義HTML輸出但沒有換行符
如果我將它們替換爲<br/>
,那麼導軌就會使用。 所以我嘗試使用raw()方法。 我想轉義錯誤的HTML,但在輸出中有換行符。
我結束了一些醜陋的代碼。
raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))
你有什麼建議嗎?
你應該使用simple_format幫手:
<%= simple_format @place.description %>
http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
是你在找什麼
@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標籤進行測試,並將它轉義爲<
等,因此它可以防止XSS攻擊。
這不工作。 – 2013-01-28 06:45:49
我在下面發佈了我的解決方案。 – 2013-01-28 06:51:59
這裏是一個有效的解決方案:
<%= 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選項指定屬性。
3年後,但它永遠不會太晚,提供一個良好的工作解決方案
這將逃避所有HTML字符,但換行符(兼容的Linux,Windows和Mac)
html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
謝謝百萬 – 2017-03-14 11:41:08
值得注意的是,在較新版本的rails中,xss是安全的。請參閱:http://stackoverflow.com/questions/3137393/rails-add-a-line-break-into-a-text-area – A5308Y 2013-11-22 12:58:15