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.
Danke! Ich habe einen Weg gefunden, es zu beheben, nachdem ich die Frage gestellt habe, aber das ist viel eleganter und einfacher. – alexy13
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. :) –