66 votes

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

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

J'ai essayé d'ajouter " {ln}{/ln} ; {&nbsp} et {br}{/br}" mais cela n'affiche que le html comme texte et pas de rupture.

Est-il possible de faire en sorte que le contrôle de la zone de texte utilise tout le 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, hé, mettez une ligne ici ?

0 votes

Où le rendu n'est-il pas correct ? Dans la zone de texte proprement dite, lorsque vous revenez en arrière pour modifier la valeur (par ex. <%= f.text_area :description %> ) ? Ou sur la page lorsque vous rendez la valeur en clair (c'est-à-dire <%= obj.description %> ) ?

0 votes

Sur la page où j'essaie de rendre les données, il place juste le < br > comme texte.

110voto

Karl Points 2712

Les sauts de ligne dans les zones de texte sont produits comme des `. \n '. Cependant, le problème est que si vous le déposez simplement dans votre vue, il n'y aura que des sauts de ligne dans votre source HTML.

Vous pouvez essayer d'utiliser l'outil Rails simple_format pour s'occuper de certaines de ces tâches à votre place : http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M002285

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

7 votes

Pour mémoire, pour éviter les attaques XSS, vous devriez échapper le var comme ceci : <%= simple_format h(mon_champ_texte) %>

6 votes

@tomeduarte simple_format aseptise par défaut, h() n'est pas nécessaire. C'est un vieux post... peut-être que cette fonctionnalité est nouvelle.

1 votes

@tybro0103 c'est spécifique à rails 3, introduit en github.com/rails/rails/commit/ - 2010/06/17 ; Soit je ne savais pas, soit j'ai supposé que rails 2.x (je ne me souviens plus). Merci de le mentionner pour les lecteurs suivants ! :)

86voto

Ian Points 1566

Le problème n'est pas tant l'édition de la valeur que son rendu ultérieur. Pour ajouter des caractères d'espacement à votre valeur tout en l'éditant dans une zone de texte, il suffit d'appuyer sur la touche retour. Lorsque vous rééditez cette valeur plus tard, les espaces devraient toujours être présents.

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

<%= obj.description %>

Même si votre valeur est "One \t \n \n Two" il apparaîtra à l'écran comme "One Two" .

Pour que ces nouveaux caractères de ligne séparent réellement les lignes à l'affichage, vous devez les convertir en HTML avant de les rendre :

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

Bien sûr, si les utilisateurs saisissent des données qui seront incluses dans votre HTML, vous devez échapper les valeurs pour vous protéger contre XSS . Si les nouvelles lignes sont la seule chose que vous devez soutenir, cela devrait être aussi simple que cela :

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

Si vous souhaitez autoriser un formatage plus complexe, consultez le site suivant Markdown et Textile (pour lesquels Rails fournit des méthodes d'aide à la visualisation). Assurez-vous simplement d'examiner le support éventuel qu'ils fournissent pour la prévention des XSS.

43 votes

À partir de Rails 3, vous devrez ajouter .html_safe : <%= h(obj.description).gsub(/ \n /, '<br/>').html_safe %>

10voto

vpsz Points 241

Voici une autre façon d'afficher les sauts de ligne dans une chaîne de caractères tout en échappant le reste du texte :

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

0 votes

J'ai aimé et j'ai ajouté ma propre chose personnalisée dedans.

2 votes

Vous pouvez également utiliser le tag aide, comme ceci : safe_join(@object.textarea_input.split("\r\n"), tag(:br))

1voto

kentor Points 321

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<br />bar"

Dans les rails 3, si vous voulez évaluer le html, vous pourriez faire <%=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 besoin de faire cela, il suffit de faire <%= "foo<br />bar" %>

De plus, le HTML n'est pas évalué dans un textarea de toute façon.

1voto

moo Points 11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X