2010-10-14 16 views
44

Schienen 3 scheint alles zu entkommen, einschließlich HTML. Ich habe versucht, rohe() zu verwenden, aber es entkommt immer noch HTML. Gibt es eine Problemumgehung? Das ist mein Helfer, ich bin mit (/helpers/application_helper.rb):nicht entkommen HTML in Ruby auf Schienen

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 

ich die Helfer in meiner Ansicht nenne diesen Code verwenden:

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

Antwort

80

Sie .html_safe wie diese verwenden:

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

Danke! Ich habe einen Weg gefunden, es zu beheben, nachdem ich die Frage gestellt habe, aber das ist viel eleganter und einfacher. – alexy13

+10

Hervorragende Antwort. Trotz 15-minütiger Tutorials überrascht es mich immer wieder, wie schwierig einige der einfachsten Aufgaben in Rails sind. Mit einem Bulldozer ist alles gut und gut, aber es gibt Zeiten, die alles, was Sie brauchen, ist eine Shrimp-Gabel. :) –

3

ich lief in die gleiche Sache und entdecken eine sicherere Lösung als html_safe mit, vor allem, wenn Sie Zeichenfolge einführen, die dynamisch sind.

Zuerst wird der aktualisierte Code:

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) %> 

Dieser entkommt long_message Inhalt, wenn es nicht sicher ist, überlässt es aber unescaped wenn es sicher ist.

Dies ermöglicht "long message for success & such." ordnungsgemäß anzuzeigen, aber auch "malicious message <script>alert('foo')</script>".

Die Erklärung läuft darauf hinaus, diese nach unten - 'foo'.html_safe ein Active zurück :: Safebuffer, die in jeder Hinsicht mit einer Ausnahme wie ein String wirkt: Wenn Sie anhängen einen String an einen Safebuffer (von + oder < Aufruf <), dass andere String ist HTML-maskiert, bevor es an den SafeBuffer angehängt wird. Wenn Sie einen anderen SafeBuffer an einen SafeBuffer anhängen, wird kein Entweichen auftreten. Rails rendert alle Ihre Ansichten unter Verwendung der SafeBuffers unter der Haube, also stellt die aktualisierte Methode oben Rails mit einem SafeBuffer zur Verfügung, den wir kontrolliert haben, um auf der long_message "nach Bedarf" zu entkommen anstatt "immer".

Jetzt geht der Kredit für diese Antwort vollständig zu Henning Koch, und wird viel ausführlicher bei Everything you know about html_safe is wrong erklärt - meine Zusammenfassung versucht oben nur das Wesen der Erklärung im Falle, dass diese Verbindung jemals stirbt.

+0

Das macht nicht viel Sinn, weil es * alle * HTML in 'long_message1' und' long_message2' entkommt. Der Fragesteller scheint etwas HTML zulassen zu wollen. Er kann das tun, indem er '.html_safe' in der Zeichenfolge aufruft, aber offensichtlich sollte er das nur tun, wenn er der Zeichenkette vertrauen kann. Was Sie vorschlagen, wird kein HTML erlauben, es wird alles mit Escapezeichen versehen. Bitte korrigieren Sie mich, falls ich falsch liege. – Mischa

+0

@Mischa Dies entzieht nicht alle HTML in 'long_message1' und' long_message2' - das ist der springende Punkt. :-) Das Verkettungsverhalten von SafeBuffer entzieht nur Inhalt, wenn es unsicher ist. In meiner Antwort schließe ich ein Beispiel mit '&' ein, das korrekt * nicht * maskiert ist und als '&' angezeigt wird (nicht '&'). Wenn Sie sich für weitere Beispiele und Details interessieren, beachten Sie den Link zu Henning Kochs vollständiger Erklärung. – DreadPirateShawn

+0

Danke. Ich denke, ich muss mir SafeBuffer genauer ansehen. Ich frage mich, wie es bestimmt, was sicher ist und was nicht. Zum Beispiel, was wenn ein Fragesteller eine Verbindung in seiner Nachricht haben möchte? Würde es das in Ihrer Implementierung erlauben? – Mischa

Verwandte Themen