En Rails: ¿existe un método de rails para convertir nuevas líneas en <br>?

115

¿Existe una forma Railsy de convertir \ n a <br>?

Actualmente, lo estoy haciendo así:

mystring.gsub(/\n/, '<br>')
daustin777
fuente
¿Qué hacen los dos personajes /? Yo uso "en su lugar.
alamodey
Los dos caracteres / indican que es una expresión regular
joshua.paling

Respuestas:

260

Sí, rieles tiene lo simple_formatque hace exactamente lo que estás buscando, y un poco mejor, ya que también agrega etiquetas de párrafo. Ver

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

Ejemplo:

 simple_format(mystring)

Tenga en cuenta que simple_formatpermite etiquetas HTML básicas, pero también pasa texto a través del sanitizecual elimina todos los scripts, por lo que debería ser seguro para la entrada del usuario.

Daniel Von Fange
fuente
1
Gracias, debería haberlo sabido, he usado simple_format en otros proyectos.
daustin777
3
Cabe señalar que simple_formatenvuelve automáticamente el texto proporcionado en <p>etiquetas, y que esta funcionalidad no se puede evitar.
Isaac Moore
1
simple_format es un riesgo de seguridad si se usa para una aplicación web. Se basa en Rails para interpretar una sintaxis especial javascript:alert(\no!\)como se indica en la referencia. Podría haber variaciones infinitas y variaciones futuras para que los piratas informáticos malintencionados trabajen.
Chloe
3
desde rails 4, simple_format tiene una wrapper_tagopción que permite cambiar la <p>etiqueta por cualquier otra cosa
Lluís
41

Puede hacerlo más general haciendo:

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

De esta forma cubriría DOS, * NIX, Mac y terminaciones de línea no válidas accidentales.

Tomalak
fuente
5
+1 para la solución generalizada sin Rails. Como desarrollador de Ruby al que no le gustan los Rails, hay muy pocos de estos.
Winfield Trail
3
Buena expresión regular, gracias. Si desea hacer algo similar a simple_formatpuede dividir en esa expresión regular, use mappara envolver las cadenas en las petiquetas de apertura y cierre , y luego únalas. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joindebería hacerlo, aunque no lo probé.
Brian Kung
Excelente truco @BrianKung, ¡era exactamente lo que estaba buscando!
alexventuraio
Además, si quieres hacer las etiquetas HTML generado a salvo en un raíles ver, simplemente hacer algo como esto y también puede agregar una clase para cada elemento generada: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. ¡Y funciona como un encanto boohoo!
alexventuraio
A pesar de que esta respuesta tiene muchas votaciones positivas, quiero agregar que esto es susceptible de secuencias de comandos entre sitios. Solo puede hacerlo si confía en la entrada (es decir, sin la entrada del usuario). De mystringlo contrario, podría contener HTML arbitrario.
NobodysNightmare
29

Debe tener cuidado con esto cuando se trata de entradas de usuario.
simple_formatinserta <br>etiquetas pero permitirá otras etiquetas html .

Cuando use simple_format, <b>Hello</b>se representará como " Hola ", es posible que no desee esto.

En su lugar, puede usar <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()primero codificará el html, gsubreemplaza el salto de línea y html_safepermite la<br> que se muestren etiquetas.

Esto mostrará exactamente lo que ingresó el usuario. También permite discutir html en, por ejemplo, comentarios.

jomo
fuente
Sí. así, funciona y quiero la salida como entrada, con los retornos mostrados.
Tim
Si bien simple_formatpermite etiquetas HTML básicas, es importante tener en cuenta que también pasa el texto sanitize, lo que elimina todo lo que podría ser potencialmente malicioso. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy
Es importante tener en cuenta que incluso el HTML desinfectado permite enlaces básicos. Se puede utilizar un enlace para dirigir a los usuarios a un sitio de phishing. Debe tener especial cuidado con esto si está mostrando un mensaje generado por el usuario en un correo electrónico enviado por su aplicación.
James
17

Simplemente use

white-space: pre-line;

en su css y el texto se ajustará a los saltos de línea.

bershika
fuente
Sí, simplemente simple_format no me funciona para casos extremos como tener varias líneas nuevas concatenadas. por ejemplo, \ r \ n \ r \ n
emaxi
1
Una solución elegante y agradable que hace exactamente lo que solicita el OP y nada más: el texto con etiquetas html no se representará como html. en mi caso, quería que la salida coincidiera exactamente con la entrada (por ejemplo, <b> </b> no mostrará el texto en negrita.
David
1

También puede considerar lo que está tratando de hacer: si está formateando bien el texto que la gente ha ingresado, podría considerar un filtro como Markdown para permitir a sus usuarios formatear su texto sin abrir la lata de gusanos que es HTML. Ya sabes, como si estuviera aquí en Stack Overflow.

Jim Puls
fuente
0

¡No! Lo que tienes ahí es la alternativa de uso común. La definición que la mayoría de la gente usa es:

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

Se llama así porque imita la funcionalidad de la función PHP con el mismo nombre .

centeno
fuente
1
No voté en contra, pero los explicaría de esta manera: una respuesta que no toma en cuenta algo como simple_format no parece molesta, pero una con un "No" definitivo. al principio desalienta a la gente a seguir buscando.
cesoide
0
mystring.gsub(/\r\n|\r|\n/, '\n')

trabajó para mi


fuente
0

Puedes hacer simple_format(h(text))- elh se asegurará de que no se procese ningún HTML.

Como se mencionó en otras respuestas, esto hará un poco más de lo que pidió. Envuelve todo <p>y agrega más párrafos si tiene líneas nuevas dobles en cualquier lugar.

Henrik N
fuente