Schienen — Fügt einen Zeilenumbruch in einen Textbereich ein

Lesezeit: 5 Minuten

Ich habe eine Rails-App, in der ich ein paar Textabsätze in mein Modell eingeben kann. Das Problem ist, dass ich nicht weiß, wie ich Zeilenumbrüche eingeben kann.

Ich habe versucht, ” {ln}{/ln} ; {&nbsp} und {br}{/br}” hinzuzufügen, aber das zeigt den HTML-Code nur als Text und ohne Unterbrechung an.

Kann ich es trotzdem so einstellen, dass das Textbereichssteuerelement einen beliebigen HTML-Code verwendet, den ich im Modelleintrag platziere?

Gibt es etwas, das ich eingeben kann, damit Rails erkennen, hey, setze hier eine Zeile?

  • Wo wird nicht richtig gerendert? Innerhalb des eigentlichen Textbereichs, wenn Sie zurückgehen, um den Wert zu bearbeiten (dh <%= f.text_area :description %>)? Oder auf der Seite, wenn Sie den Wert einfach wiedergeben (d. h <%= obj.description %>)?

    – Ian Lesperance

    29. Juni 2010 um 3:14 Uhr

  • Auf der Seite, auf der ich versuche, die Daten zu rendern, wird nur das < br > als Text platziert

    – ChrisWesAllen

    29. Juni 2010 um 15:05 Uhr

Zeilenumbrüche in Textfeldern werden als `\n’ ausgegeben. Das Problem ist jedoch, dass, wenn Sie es einfach in Ihre Ansicht kopieren, es nur Zeilenumbrüche in Ihrer HTML-Quelle sind.

Sie können versuchen, die Rails zu verwenden simple_format Helfer, der einiges davon für Sie erledigt: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M002285

Zeilenumbrüche werden automatisch in HTML-Tags umgewandelt. Sie können es mit etwas wie verwenden <%= simple_format(my_text_field) %>.

  • Fürs Protokoll: Um XSS-Angriffe zu vermeiden, sollten Sie die Variable folgendermaßen maskieren: <%= simple_format h(my_text_field) %>

    – Tomeduarte

    15. Januar 2011 um 15:51 Uhr

  • @tomeduarte simple_format bereinigt standardmäßig, h() wird nicht benötigt. Dies ist ein alter Beitrag … vielleicht ist diese Funktionalität neu.

    – tybro0103

    26. März 2012 um 18:19 Uhr


  • @tybro0103 es ist spezifisch für Rails 3, eingeführt in github.com/rails/rails/commit/… – 17.06.2010; Entweder kannte ich Rails 2.x nicht oder nahm es an (kann mich nicht erinnern). Vielen Dank für die Erwähnung für die folgenden Leser! 🙂

    – Tomeduarte

    27. März 2012 um 21:30 Uhr

  • Das Problem mit simple_format ist, dass es zu schlau ist. Es behält jedes \n in Ihrem Text bei, geht aber davon aus, dass zwei \n einen neuen Absatz anzeigen sollen, und nimmt Ihre Eingabe auf und umschließt bestimmte Teile davon <p> Stichworte. Es hängt wirklich von Ihren Bedürfnissen ab, welche Methode Sie verwenden sollten. Wenn du unbedingt alle neuen Zeilen beibehalten müssen, sollten Sie die akzeptierte Antwort verwenden. Verwenden Sie andernfalls simple_format und planen Sie Absatz-Tags ein, an denen Sie diesen Wert ausgeben.

    – Aaron

    10. Mai 2012 um 14:43 Uhr

Das Problem besteht nicht so sehr darin, den Wert zu bearbeiten, sondern ihn später zu rendern. Um Zeilenumbruchzeichen zu Ihrem Wert hinzuzufügen, während Sie ihn in einem Textbereich bearbeiten, drücken Sie einfach die Eingabetaste. Wenn Sie diesen Wert später erneut bearbeiten, sollte der Leerraum immer noch vorhanden sein.

Das Rendern des Leerraums ist der schwierige Teil. In HTML sind Leerzeichen im Allgemeinen unbedeutend. Ein Renderer wie der, den Ihr Browser verwendet, zeigt ein einzelnes Leerzeichen für jede fortlaufende Zeichenfolge von Leerzeichen an. Es reicht also nicht aus, den Wert einfach auf die Seite zu übertragen:

<%= obj.description %>

Auch wenn Ihr Wert sein mag "One \t \n \n Two"es wird auf dem Bildschirm als angezeigt "One Two".

Damit diese neuen Zeilenzeichen die Zeilen bei der Anzeige tatsächlich trennen, müssen Sie sie vor dem Rendern in HTML konvertieren:

<%= obj.description.gsub(/\n/, '<br/>') %>

Wenn Benutzer Daten eingeben, die in Ihren HTML-Code aufgenommen werden, sollten Sie die Werte natürlich maskieren, um sich davor zu schützen XSS. Wenn neue Zeilen das einzige sind, was Sie unterstützen müssen, sollte es so einfach sein:

<%= h(obj.description).gsub(/\n/, '<br/>') %>

Wenn Sie eine komplexere Formatierung zulassen möchten, schauen Sie in Abschlag und Textil (für beide stellt Rails Helper-View-Methoden bereit). Stellen Sie einfach sicher, dass Sie untersuchen, ob und welche Unterstützung sie für die XSS-Prävention bieten.

  • Ab Rails 3 müssen Sie .html_safe hinzufügen: <%= h(obj.description).gsub(/\n/, '
    ‘).html_safe %>

    – tybro0103

    26. März 2012 um 18:22 Uhr

Lassen Sie die Benutzereingaben unverändert und fügen Sie dies Ihrem CSS hinzu:

white-space: pre-line;

Es wird \r oder \n (Eingabe) in der Benutzereingabe als neue Zeile angezeigt.

  • So viel einfacher. Gute Antwort.

    – Dennis Best

    7. April 2016 um 2:38 Uhr

  • Dies sollte die Antwort sein.

    – Onichan

    7. Mai 2016 um 8:29 Uhr

  • simple_format scheint nur 1 Zeilenumbruch beizubehalten, obwohl Sie mehrere haben, wenn Sie in Mailer-Ansichten verwenden. Diese Antwort funktioniert1

    – Abdullah Aden

    4. November 2020 um 14:09 Uhr

  • Wow, ich kann nicht glauben, dass das all die Jahre hier war. Und es wird von jedem Browser unterstützt!

    – Installateur

    17. Dezember 2020 um 10:58 Uhr

Hier ist eine andere Möglichkeit, die Zeilenumbrüche in einer Zeichenfolge anzuzeigen, während der Rest des Textes maskiert wird:

<%= safe_join(@object.textarea_input.split("\r\n"), "<br />".html_safe) %>

Siehe hier http://code.byteblues.com/2012/03/23/preloading-a-text-input-area-text_area-with-data-that-contains-a-line-break/

<%=raw text_area_tag :keywords, keywords, :rows => 8 %>

Benutzer-Avatar
Sagiv Ofek

das Problem mit simple_format ist, dass es auch andere Tags wie hinzufügt <b><i><hr><h1>
Wenn Sie nur Zeilenumbrüche ohne andere Tags möchten, schlage ich vor, dass Sie einen Teil erstellen (nennen wir es line_break):

<% text.split("\n").each do |t| %>
  <%= t %><br>
<% end %>

dann rufen Sie es einfach aus Ihrer Sicht auf:

<%= render partial: 'line_break', locals: {text: some_text} %>

Benutzer-Avatar
tbem

Welche Schienenversion verwendest du?? Denn die Art und Weise, wie damit umgegangen wird, ist in Gleis 2 und 3 unterschiedlich.

Nehmen wir an, der Wert des Datensatzes ist "foo<br />bar"

Wenn Sie in Rails 3 den HTML-Code auswerten möchten, können Sie dies tun <%=raw "foo<br />bar" %>wenn Sie dies tun, erhalten Sie einen Zeilenumbruch, wenn Sie die Ansicht sehen.

In Rails 2 müssen Sie das nicht tun, tun Sie es einfach <%= "foo<br />bar" %>

Außerdem wird HTML sowieso nicht in einem Textbereich ausgewertet.

1304140cookie-checkSchienen — Fügt einen Zeilenumbruch in einen Textbereich ein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy