web-dev-qa-db-fra.com

Array.join ("\ n") n'est pas le moyen de rejoindre une nouvelle ligne?

J'ai un tableau ..

[1,2,3,4]

et je veux une chaîne contenant tous les éléments séparés par une nouvelle ligne.

1

2

3

4

mais quand j'essaie [1,2,3,4].join("\n") je reçois

1\n2\n3\n4

J'ai l'impression qu'il y a une réponse évidente mais je ne la trouve pas!

50
jdimona

Oui, mais si vous imprimez cette chaîne, il y aura des nouvelles lignes:

irb(main):001:0> a = (1..4).to_a
=> [1, 2, 3, 4]
irb(main):002:0> a.join("\n")
=> "1\n2\n3\n4"
irb(main):003:0> puts a.join("\n")
1
2
3
4

Donc, il semble réaliser ce que vous désirez (?)

68
Cody Caughlan

Une erreur subtile qui peut se produire ici consiste à utiliser des guillemets simples au lieu de doubles. Cela a également pour effet de rendre les nouvelles lignes en\n. Alors

puts a.join("\n")   # correct

n'est pas la même chose que

puts a.join('\n')   # incorrect

Il existe une excellente description de la raison pour laquelle c'est le cas ici .

40
Screamer

Juste au cas où ceux qui recherchent cette fonctionnalité dans le modèle ERB essaient ceci: 

(1..5).to_a.join("<br>").html_safe
7
Ajay

Essayez ceci aussi:

puts (1..4).to_a * "\n"
5
khelll

Vous pouvez ne pas vouloir utiliser html_safe, comme ajay, selon le contexte. Html safe peut être un problème de sécurité. Cela dépend si l'entrée d'origine était réellement html safe. Le coffre-fort HTML ne doit pas être appelé directement par un utilisateur et doit généralement être appelé avant la vue.

https://bibwild.wordpress.com/2013/12/19/you-never-want-tocall-html_safe-in-a-Rails-template/

[édité en réponse au commentaire ci-dessous]

2
alli

Que diriez-vous de cela si vous vouliez imprimer chaque élément sur une nouvelle ligne?.

> a = [1, 2, 3, 4] 
> a.each{|e| puts e}
1
2
3
4
 => [1, 2, 3, 4] 
0
Hetal Khunti

Comme le suggèrent certaines des réponses ci-dessus, il est possible que Rails échappe à votre code avant le rendu au format HTML. Voici un exemple qui résout ce problème (commencez par nettoyer les entrées afin de pouvoir appeler "en toute sécurité" le html_safe dans le résultat):

my_array = [1, 2, 3, 4]
my_array.map{ |i| i.to_s.sanitize }.join("\n").html_safe

Vous n'avez besoin que de sanitize si vous ne faites pas confiance aux entrées.

0
staxim

Utilisez la touche Entrée ou Retour sur votre surface de frappe. .-.

[1,2,3,4] .join ("

")

0
Eddie