it-swarm.com.de

Ruby on Rails: Wie kann man einen String als HTML rendern?

Ich habe

@str = "<b>Hi</b>"

und aus meiner erb sicht:

<%= @str %>

Was auf der Seite angezeigt wird, ist: <b>Hi</b> wenn was ich wirklich will ist Hallo. Wie kann man Ruby einen String als HTML-Markup "interpretieren"?


Bearbeiten: der Fall wo

@str = "<span class=\"classname\">hello</span>"

Wenn ich das aus meiner Sicht tue

<%raw @str %>

Der HTML-Quellcode ist <span class=\"classname\">hello</span> wo was ich wirklich will ist <span class="classname">hello</span> (ohne die Backslashes, die den doppelten Anführungszeichen entgangen sind). Was ist der beste Weg, um diese doppelten Anführungszeichen zu umgehen?

148
Tim

AKTUALISIEREN

Aus Sicherheitsgründen wird empfohlen, sanitize anstelle von html_safe Zu verwenden. Link


Was passiert, ist, dass aus Sicherheitsgründen Rails für Sie an Ihrem String vorbeigeht, weil darin möglicherweise bösartiger Code eingebettet ist. Aber wenn Sie Rails Wenn Ihre Zeichenfolge html_safe ist, wird sie direkt weitergeleitet.

@str = "<b>Hi</b>".html_safe
<%= @str %>

OR

@str = "<b>Hi</b>"
<%= @str.html_safe %>

Die Verwendung von raw funktioniert einwandfrei, aber alles, was es tut, ist, die Zeichenfolge in eine Zeichenfolge zu konvertieren und dann html_safe aufzurufen. Wenn ich weiß, dass ich eine Zeichenfolge habe, rufe ich html_safe lieber direkt auf, weil dadurch ein unnötiger Schritt übersprungen und klarer wird, was los ist. Details zum String-Escaping und zum XSS-Schutz finden Sie in this Asciicast .

318
Jacob

Verwenden Sie raw :

<%=raw @str >

Aber wie @ jmort253 richtig sagt, überlege, wo das HTML wirklich hingehört.

16
Michael Stum

Wenn Sie auf Rails sind, bei dem Erubis verwendet wird, ist dies die coolste Methode

<%== @str >

Beachten Sie das doppelte Gleichheitszeichen. Siehe verwandte Frage zu SO für weitere Informationen.

14
jibiel

Sie können auch simple_format(@str) verwenden, um bösartigen Code zu entfernen. Lesen Sie hier mehr: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

8
bcackerman

Sie mischen Ihre Geschäftslogik mit Ihren Inhalten. Stattdessen würde ich empfehlen, die Daten an Ihre Seite zu senden und dann JQuery zu verwenden, um die Daten dort zu platzieren, wo Sie sie benötigen.

Dies hat den Vorteil, dass Ihr gesamter HTML-Code auf den HTML-Seiten bleibt, zu denen er gehört, sodass Ihre Webdesigner den HTML-Code später ändern können, ohne den serverseitigen Code durchlaufen zu müssen.

Wenn Sie kein JavaScript verwenden möchten, können Sie Folgendes versuchen:

@str = "Hi"

<b><%= @str ></b>

Zumindest auf diese Weise befindet sich Ihr HTML in der HTML-Seite, zu der es gehört.

7
jmort253

Oder Sie können die Methode CGI.unescapeHTML ausprobieren.

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"
6
Arman Ortega

da Sie übersetzen und Ihren gewünschten Code aus der beschissenen codierten Datei einer Person heraussuchen, können Sie content_tag in Kombination mit Ihren regulären Ausdrücken verwenden.

Wenn Sie die API-Dokumente stehlen, können Sie diesen übersetzten Code in einen content_tag Wie folgt interpolieren:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

Wenn Sie Ihren Code nicht kennen, wird diese Art des Denkens sicherstellen, dass Ihr übersetzter Code zu konform ist.

0
pjammer

@str = "<span class=\"classname\">hello</span>" Wenn ich das aus meiner Sicht tue

<%raw @str %> Der HTML-Quellcode ist <span class=\"classname\">hello</span> wo was ich wirklich will ist <span class="classname">hello</span> (ohne die Backslashes, die den doppelten> Anführungszeichen entgangen sind). Was ist der beste Weg, um diese doppelten Anführungszeichen zu umgehen?

Lösung: Verwenden Sie doppelte Anführungszeichen in einfachen Anführungszeichen (oder einfache Anführungszeichen in doppelten), um zu vermeiden, dass Sie mit einem Backslash davonkommen.

@str = '<span class="classname">hello</span>'
<%raw @str %>
0
Crash

Die html_safe-Version funktioniert gut in Rails 4 ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
0
G. A.