In Rails, esiste un metodo rails per convertire le nuove righe in <br>?


115

Esiste un modo Railsy per convertire \ n in <br>?

Attualmente, lo sto facendo in questo modo:

mystring.gsub(/\n/, '<br>')

Cosa fanno i due / personaggi? Io uso "invece.
alamodey

I due caratteri / indicano che è
un'espressione

Risposte:


260

Sì, rails ha simple_formatche fa esattamente quello che stai cercando, e leggermente migliore poiché aggiunge anche tag di paragrafo. Vedere

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

Esempio:

 simple_format(mystring)

Nota che simple_formatconsente tag HTML di base, ma passa anche il testo attraverso il sanitizequale rimuove tutti gli script, quindi dovrebbe essere sicuro per l'input dell'utente.


1
Grazie, avrei dovuto saperlo, ho usato simple_format in altri progetti.
daustin777

3
Va notato che simple_formatavvolge automaticamente il testo fornito nei <p>tag e che questa funzionalità non può essere evitata.
Isaac Moore

1
simple_format rappresenta un rischio per la sicurezza se lo si utilizza per un'app Web. Si basa su Rails che interpreta la sintassi speciale come javascript:alert(\no!\)quella fornita nel riferimento. Potrebbero esserci infinite variazioni e variazioni future con cui gli hacker malintenzionati possono lavorare.
Chloe

3
da rails 4, simple_format ha wrapper_tagun'opzione che consente di cambiare <p>tag per qualsiasi altra cosa
Lluís

41

Puoi renderlo più generale facendo:

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

In questo modo coprirai DOS, * NIX, Mac e terminazioni di riga non valide accidentali.


5
+1 per la soluzione generalizzata, non Rails. In qualità di sviluppatore di Ruby a cui non piace Rails, ce ne sono davvero troppo pochi.
Winfield Trail

3
Bella regex, grazie. Se vuoi fare qualcosa di simile a simple_formatte puoi dividere su quella regex, usare mapper avvolgere le stringhe nei ptag di apertura e chiusura , e poi unirli. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joindovrebbe farlo, anche se non l'ho testato.
Brian Kung

Ottimo trucco @BrianKung era esattamente quello che stavo cercando!
alexventuraio

Inoltre, se si vuole fare i tag HTML generati sicuro in un rotaie visualizzare, basta fare una cosa del genere e inoltre è possibile aggiungere una classe per ogni elemento generato: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. E funziona come un fascino boohoo!
alexventuraio

Anche se questa risposta è molto votata, voglio aggiungere che è suscettibile di cross site scripting. Puoi farlo solo se ti fidi dell'input (cioè nessun input dell'utente). Altrimenti mystringpotrebbe contenere HTML arbitrario.
NobodysNightmare

29

Dovresti fare attenzione quando hai a che fare con l'input dell'utente.
simple_formatinserisce <br>tag ma consentirà altri tag html !

Quando si utilizza simple_format, <b>Hello</b>verrà visualizzato come " Hello ", potresti non volerlo.

Invece puoi usare <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()codificherà prima l'html, gsubsostituisce l'interruzione di riga e html_safeconsente la visualizzazione dei <br>tag.

Questo mostrerà esattamente ciò che l'utente ha inserito. Permette anche di discutere html ad esempio nei commenti.


Sì. in questo modo, funziona e voglio l'output proprio come l'input, con i rendimenti mostrati.
Tim

Sebbene simple_formatconsenta tag HTML di base, è importante notare che passa anche il testo sanitize, il che rimuove tutto ciò che potrebbe essere potenzialmente dannoso. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

È importante notare che anche l'HTML disinfettato consente collegamenti di base. È possibile utilizzare un collegamento per indirizzare gli utenti a un sito di phishing. Devi stare particolarmente attento con questo se stai visualizzando un messaggio generato dall'utente in un'e-mail inviata dalla tua applicazione.
James

17

Basta usare

white-space: pre-line;

nel tuo css e il testo andrà a capo su interruzioni di riga.


Sì, simple_format non funziona per me per casi limite come avere vari newline concatenati. ad esempio \ r \ n \ r \ n
emaxi

1
bella ed elegante soluzione che fa esattamente quello che richiede l'OP e niente di più - il testo con tag html non verrà reso come html. nel mio caso volevo che l'output corrispondesse esattamente all'input (ad es. <b> </b> non visualizzerà il testo in grassetto.
David

1

Potresti anche considerare ciò che stai cercando di fare: se stai formattando bene il testo che le persone hanno inserito, potresti prendere in considerazione un filtro come Markdown per consentire ai tuoi utenti di formattare il loro testo senza aprire il barattolo di worm che è HTML. Sai, come qui su Stack Overflow.


0

No. Quello che hai è l'alternativa comunemente usata. La definizione che la maggior parte delle persone usa è:

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

È chiamato come tale perché imita la funzionalità della funzione PHP con lo stesso nome .


1
Non ho downvote, ma li spiegherei in questo modo: una risposta che non tiene conto di qualcosa come simple_format non sembra fastidiosa, ma una con un "No" definitivo. all'inizio scoraggia le persone dal guardare oltre.
cesoid

0
mystring.gsub(/\r\n|\r|\n/, '\n')

ha funzionato per me


0

Puoi farlo simple_format(h(text)): hassicurerà che qualsiasi HTML non venga visualizzato.

Come accennato in altre risposte, questo farà un po 'di più di quanto richiesto. Racchiude l'intera cosa <p>e aggiunge più paragrafi se hai doppie nuove righe ovunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.