2010-10-14 55 views
44

rails 3似乎逃避一切,包括html。我曾嘗試使用raw(),但它仍然轉義html。有沒有解決方法?這是我的幫助,我現在用(/helpers/application_helper.rb):不要在軌道上的ruby中轉義html

module ApplicationHelper 
    def good_time(status = true) 
    res = "" 
    if status == true 
     res << "Status is true, with a long message attached..." 
    else 
     res << "Status is false, with another long message" 
    end 
    end 
end 

我使用此代碼調用助手在我看來:

<%= raw(good_time(true)) %> 

回答

80

您可以使用.html_safe這樣的:

def good_time(status = true) 
    if status 
    "Status is true, with a long message attached...".html_safe 
    else 
    "Status is false, with another long message".html_safe 
    end 
end 

<%= good_time(true) %> 
+1

謝謝!我在發佈問題後發現了一種解決方法,但這更加優雅和簡單。 – alexy13 2010-10-14 11:30:14

+10

傑出的答案。儘管有15分鐘的教程,但我總是驚訝於Rails中一些最瑣碎的任務有多困難。推土機一切都很好,但有時候你需要的是一個蝦叉。 :) – 2012-07-03 22:23:44

3

我遇到了同樣的事情,並發現了一個更安全的解決方案比使用html_safe,尤其是當你介紹字符串這是動態的。

首先,更新後的代碼:

def good_time(long_message1, long_message2, status = true) 
    html = "".html_safe 
    html << "Status is #{status}, " 
    if status 
    html << long_message1 
    else 
    html << long_message2 
    end 
    html 
end 

<%= good_time(true) %> 

此逃脫long_message的內容,如果它是不安全的,但離開它轉義,如果它是安全的。

這允許"long message for success & such."正確顯示,但也逃脫"malicious message <script>alert('foo')</script>"

的解釋歸結爲 - 'foo'.html_safe返回的ActiveSupport :: SafeBuffer這就像除了一個在各方面的String:當你添加一個字符串到SafeBuffer(通過調用+或< <),其他字符串在被附加到SafeBuffer之前被HTML轉義。將另一個SafeBuffer附加到SafeBuffer時,不會發生轉義。 Rails使用SafeBuffers渲染所有視圖,因此上面更新的方法最終爲Rails提供了一個SafeBuffer,我們控制它在long_message「按需」而不是「always」執行轉義。

現在,這個答案的功勞完全歸功於Henning Koch,並在Everything you know about html_safe is wrong詳細解釋 - 我上面的回顧只是試圖提供這個鏈接永遠消亡的解釋的本質。

+0

這沒什麼意義,因爲它會在'long_message1'和'long_message2'中轉義* all * HTML。提問者似乎想要允許一些HTML。他可以通過在字符串上調用'.html_safe'來做到這一點,但顯然他只能這樣做,如果他可以信任字符串。你提出的建議不會允許任何HTML,它將全部逃脫。如果我錯了,請糾正我。 – Mischa 2017-02-08 16:29:00

+0

@Mischa這不會逃避'long_message1'和'long_message2'中的所有HTML - 這就是整個觀點。 :-) SafeBuffer的連接行爲只會在內容不安全的情況下轉義。在我的回答中,我用'&'包含了一個例子,它正確*不*轉義,並顯示爲&&(不是'&')。另外,如果您對更多示例和細節感興趣,請注意Henning Koch的完整解釋鏈接。 – DreadPirateShawn 2017-02-08 17:29:31

+0

謝謝。我想我必須深入瞭解SafeBuffer。我想知道它是如何確定什麼是安全的,什麼不是。例如,如果提問者想在他的消息中有一個鏈接呢?它會允許你的實現嗎? – Mischa 2017-02-08 17:49:32