Dans Rails - existe-t-il une méthode de rails pour convertir les nouvelles lignes en <br>?


115

Existe-t-il un moyen Railsy de convertir \ n en <br>?

Actuellement, je le fais comme ceci:

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

Que font les deux personnages /? J'utilise "à la place.
alamodey

Les deux / chars indiquent que c'est une expression régulière
joshua.paling

Réponses:


260

Oui, rails a simple_formatqui fait exactement ce que vous recherchez, et légèrement mieux car il ajoute également des balises de paragraphe. Voir

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

Exemple:

 simple_format(mystring)

Notez que cela simple_formatautorise les balises HTML de base, mais transmet également le texte à travers sanitizelequel supprime tous les scripts, il devrait donc être sûr pour les entrées utilisateur.


1
Merci - j'aurais dû le savoir - j'ai utilisé simple_format dans d'autres projets.
daustin777

3
Il est à noter que cela simple_formatenveloppe automatiquement le texte fourni dans des <p>balises, et que cette fonctionnalité ne peut être évitée.
Isaac Moore

1
simple_format est un risque de sécurité si vous l'utilisez pour une application Web. Il repose sur Rails interprétant une syntaxe spéciale comme javascript:alert(\no!\)celle donnée dans la référence. Il pourrait y avoir des variations infinies et futures avec lesquelles les pirates malveillants pourraient travailler.
Chloe

3
depuis rails 4, simple_format a une wrapper_tagoption qui permet de changer de <p>balise pour n'importe quoi d'autre
Lluís

41

Vous pouvez le rendre plus général en faisant:

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

De cette façon, vous couvririez DOS, * NIX, Mac et les fins de ligne invalides accidentelles.


5
+1 pour la solution non-Rails généralisée. En tant que développeur Ruby qui n'aime pas Rails, il y en a beaucoup trop peu.
Winfield Trail

3
Belle regex, merci. Si vous voulez faire quelque chose de similaire, simple_formatvous pouvez diviser sur cette expression régulière, utiliser mappour envelopper les chaînes dans les pbalises d' ouverture et de fermeture , puis les joindre. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joindevrait le faire, même si je ne l'ai pas testé.
Brian Kung

Excellent truc @BrianKung c'était exactement ce que je cherchais!
alexventuraio

Aussi , si vous voulez faire les balises HTML générées en sécurité dans un rail voir, faire quelque chose comme ça et vous pouvez également ajouter une classe pour chaque élément généré: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. Et ça marche comme un charme boohoo!
alexventuraio

Même si cette réponse est beaucoup mieux votée, je tiens à ajouter que cela est susceptible de faire des scripts intersites. Vous ne pouvez le faire que si vous faites confiance à l'entrée (c.-à-d. Aucune entrée utilisateur). Sinon, mystringpourrait contenir du HTML arbitraire.
NobodysNightmare

29

Vous devez être prudent avec cela lorsque vous traitez avec les entrées utilisateur.
simple_formatinsère des <br>balises mais cela autorisera d'autres balises html !

Lorsque vous utilisez simple_format, <b>Hello</b>sera rendu comme " Hello ", vous ne voudrez peut-être pas cela.

Au lieu de cela, vous pouvez utiliser <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()encodera d'abord le html, gsubremplace le saut de ligne et html_safepermet aux <br>balises d'être affichées.

Cela affichera exactement ce que l'utilisateur a entré. Il permet également de discuter du html dans les commentaires par exemple.


oui. comme ça, cela fonctionne et je veux la sortie comme l'entrée, avec les retours affichés.
Tim

Bien que simple_formatles balises HTML de base soient autorisées, il est important de noter qu'elles transmettent également le texte sanitize, ce qui supprime tout ce qui pourrait être potentiellement malveillant. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

Il est important de noter que même le HTML nettoyé autorise les liens de base. Un lien peut être utilisé pour diriger les utilisateurs vers un site de phishing. Vous devez être particulièrement prudent avec cela si vous affichez un message généré par l'utilisateur dans un e-mail envoyé par votre application.
James

17

Utilisez simplement

white-space: pre-line;

dans votre css et le texte sera enveloppé sur les sauts de ligne.


Ouais, simple_format ne fonctionne pas pour moi pour les cas extrêmes comme la concaténation de diverses nouvelles lignes. par exemple \ r \ n \ r \ n
emaxi

1
belle solution élégante qui fait exactement ce que l'OP demande et rien de plus - le texte avec des balises html ne sera pas rendu au format html. dans mon cas, je voulais que la sortie corresponde exactement à l'entrée (par exemple, <b> </b> n'affichera pas le texte en gras.
David

1

Vous pouvez également réfléchir à ce que vous essayez de faire - si vous formatez bien le texte que les gens ont entré, vous pouvez envisager un filtre comme Markdown pour permettre à vos utilisateurs de formater leur texte sans ouvrir la boîte de vers qui est HTML. Vous savez, comme c'est le cas ici chez Stack Overflow.


0

Nan. Ce que vous avez là est l'alternative couramment utilisée. La définition que la plupart des gens utilisent est:

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

Il est nommé comme tel car il imite la fonctionnalité de la fonction PHP du même nom .


1
Je n'ai pas voté contre, mais je les expliquerais de cette façon: une réponse qui ne prend pas en compte quelque chose comme simple_format ne semble pas gênante, mais une avec un "non" définitif. au début décourage les gens de chercher plus loin.
cesoid

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

travaillé pour moi


0

Vous pouvez faire simple_format(h(text))- leh cela garantira que le HTML n'est pas rendu.

Comme mentionné dans d'autres réponses, cela fera un peu plus que ce que vous avez demandé. Il enveloppe le tout <p>et ajoute plus de paragraphes si vous avez des doubles retours à la ligne n'importe où.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.