web-dev-qa-db-fra.com

Rails - Ajouter un saut de ligne dans une zone de texte

J'ai une application 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'ajouter "{ln} {/ ln}; {& nbsp} et {br} {/ br}" mais cela n'affiche que le code HTML sous forme de texte et pas de pause.

Est-il possible de le définir de sorte que le contrôle de zone de texte utilise l'un des codes HTML que je place dans l'entrée de modèle?

Y a-t-il quelque chose que je puisse taper pour que Rails le reconnaisse? Hé, mettez une ligne ici?

57
ChrisWesAllen

Le problème réside moins dans la modification de la valeur que dans son rendu ultérieur. Pour ajouter des caractères de nouvelle ligne à votre valeur lorsque vous la modifiez dans une zone de texte, appuyez simplement sur la touche de retour. Lorsque vous rééditez cette valeur ultérieurement, les espaces doivent toujours être présents.

Rendre les espaces blancs est la partie la plus délicate. En HTML, les espaces sont généralement insignifiants. Un moteur de rendu tel que celui utilisé par votre navigateur affichera un seul espace pour toute chaîne continue de blancs. Il ne suffit donc pas d'afficher 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 la forme "One Two".

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

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

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 nouvelles lignes, c’est aussi simple que cela:

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

Si vous souhaitez autoriser une mise en forme plus complexe, reportez-vous à Markdown et Textile (Rails fournit des méthodes de vue auxiliaire pour). Veillez simplement à rechercher le soutien éventuel qu’ils fournissent pour la prévention XSS.

83
Ian Lesperance

Les sauts de ligne dans les zones de texte sont produits sous la forme "\ n". Cependant, le problème est que si vous le déposez simplement dans votre vue, il ne s'agira que de sauts de ligne dans votre source HTML.

Vous pouvez utiliser l’assistant Rails simple_format pour s’occuper de certaines de ces tâches: 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) %>.

103
Karl

Conservez les entrées utilisateur non modifiées et ajoutez ceci à votre css:

white-space: pre-line;

Il affichera\r ou\n (entrée) dans la saisie de l’utilisateur sous la forme d’une nouvelle ligne.

19
bershika

Voici un autre moyen d'afficher les sauts de ligne dans une chaîne tout en évitant le reste du texte:

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

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

Disons que la valeur de l'enregistrement est "foo<br />bar"

Dans Rails 3, si vous souhaitez évaluer le code HTML, vous pouvez utiliser <%=raw "foo<br />bar" %>. Si vous le faites, vous obtiendrez un saut de ligne lorsque vous verrez la vue.

Dans Rails 2, vous n'avez pas à le faire, il suffit de faire <%= "foo<br />bar" %>

De plus, HTML n'est pas évalué dans une zone de texte de toute façon.

1
kentor

le problème avec simple_format est qu’il ajoute également d’autres balises telles que <b><i><hr><h1>...
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 %><br>
<% end %>

alors, appelez-le simplement de votre vue:

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

Les autres réponses sont fausses. La zone de texte ne rend pas
en tant que sauts de ligne, car la valeur innerHTML de l'élément TEXTAREA ne rend pas le code HTML.

Vous devez ajouter l'entité HTML du saut de ligne: &#10;

EXEMPLE:

<textarea><%= "LINE 1&#10;LINE 2&#10;LINE 3".html_safe %></textarea>

Voir aussi Nouvelle ligne dans la zone de texte - Dépassement de pile

0
Yarin

\n si ma mémoire est bonne (ça ne s'est pas bien passé aujourd'hui ... essayez à vos risques et périls lol)

Edit: en supposant que vous parliez d'une textarea, s'il s'agit d'une sortie simple, utilisez simplement <br>

0
mynameiscoffey

Les réponses ci-dessus étaient bonnes:

  • la gsub (@Ian) a bien fonctionné
  • le simple_format (@Karl) était un peu excessif, comme l'a souligné @Aaron, en enveloppant tout dans <p>

Alors j'ai modifié comme suit:

simple_format(value, {}, wrapper_tag: 'div')
0
Jon Kern