Rails – Ajoute un saut de ligne dans une zone de texte

J’ai une application de rails où je peux saisir quelques paragraphes de texte dans mon modèle. Le problème est que je ne sais pas comment saisir des sauts de ligne.

J’ai essayé d’append “{ln} {/ ln}; {& nbsp} et {br} {/ br}” mais cela affiche uniquement le HTML en tant que texte et pas de pause.

Y a-t-il un moyen de le configurer pour que le contrôle de la zone de texte utilise le code HTML que je place dans l’entrée du modèle?

Y a-t-il quelque chose que je puisse taper pour que les rails reconnaissent, hey mettent une ligne ici?

Le problème n’est pas tellement de modifier la valeur telle qu’elle est affichée ultérieurement. Pour append des caractères de nouvelle ligne à votre valeur lors de sa modification dans une zone de texte, appuyez simplement sur la touche Retour. Lorsque vous rééditez cette valeur ultérieurement, les espaces doivent toujours être présents.

Le rendu des espaces est la partie la plus délicate. En HTML, les espaces sont généralement insignifiants. Un moteur de rendu comme celui utilisé par votre navigateur affichera un espace unique pour toute chaîne continue d’espaces blancs. Donc, il ne suffit pas de déposer la valeur sur la page:

 <%= obj.description %> 

Même si votre valeur peut être "One \t \n \n Two" , elle apparaîtra à l’écran sous le nom "One Two" .

Pour que ces nouveaux caractères de ligne séparent réellement les lignes lors de leur affichage, vous devez les convertir en HTML avant de procéder au rendu:

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

Bien sûr, si les utilisateurs entrent des données qui seront incluses dans votre code HTML, vous devriez échapper aux valeurs à protéger contre XSS . Si vous avez besoin de prendre en charge de nouvelles lignes, cela devrait être aussi simple que cela:

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

Si vous souhaitez autoriser un formatage plus complexe, consultez Markdown et Textile (les deux pour lesquels Rails fournit des méthodes de vue d’assistance). Assurez-vous simplement de rechercher si un soutien quelconque est prévu pour la prévention XSS.

Les sauts de ligne dans les zones de texte sont produits sous la forme `\ n ‘. Cependant, le problème est que si vous le videz simplement dans votre vue, il ne restra que des sauts de ligne dans votre source HTML.

Vous pouvez essayer d’utiliser l’ simple_format Rails simple_format pour vous en occuper: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M002285

Il convertira automatiquement les sauts de ligne en balises HTML. Vous pouvez l’utiliser avec quelque chose comme <%= simple_format(my_text_field) %> .

Ne modifiez pas les entrées utilisateur et ajoutez-les à votre css:

 white-space: pre-line; 

Il affichera \ r ou \ n (enter) dans l’entrée utilisateur comme une nouvelle ligne.

Voici une autre façon d’afficher les sauts de ligne dans une chaîne tout en évitant le rest du texte:

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

Le problème avec simple_format est qu’il ajoute aussi d’autres balises comme



Si vous voulez juste des sauts de ligne sans autres balises, je vous suggère de construire un partiel (appelons-le line_break):

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

alors, appelez-le simplement de votre vue:

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

Quelle version de rails utilisez-vous? Parce que la façon de gérer cela est différente dans les rails 2 et 3.

Disons que la valeur de l’enregistrement est "foo
bar"

Dans rails 3, si vous voulez évaluer le HTML, vous pouvez faire <%=raw "foo
bar" %>
, si vous le faites, vous obtenez un saut de ligne lorsque vous verrez la vue.

Dans les rails 2, vous n’avez pas à faire cela, faites simplement <%= "foo
bar" %>

De plus, HTML n’est pas évalué dans une zone de texte.

\n si la mémoire sert (ça ne s’est pas si bien passé aujourd’hui … essayez à vos risques et périls lol)

Edit: en supposant que vous textarea une zone de textarea , si c’est une sortie simple, utilisez simplement

Si vous affichez simplement votre chaîne dans la vue. puis essayez avec

 < p >This is my text< / p >< br /> 

Les réponses ci-dessus étaient bonnes:

  • le gsub (@anan) a bien fonctionné
  • le simple_format (@Karl) était un peu exagéré comme @Aaron l’a fait remarquer, en enveloppant tout dans

J’ai donc peaufiné comme suit:

 simple_format(value, {}, wrapper_tag: 'div')