Array.join (“\ n”) pas la façon de se joindre à 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’essaye [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 le trouve pas!

Oui, mais si vous imprimez cette chaîne, elle contiendra 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 que vous réalisiez ce que vous désirez (?)

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

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

n’est pas la même que

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

Il y a une excellente description de la raison pour laquelle c’est le cas ici .

Au cas où quelqu’un chercherait cette fonctionnalité dans le modèle ERB, essayez ceci:

 (1..5).to_a.join("
").html_safe

Essayez aussi ceci:

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

Vous pouvez ne pas vouloir utiliser html_safe, comme l’a dit 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. HTML safe ne doit pas être appelé directement par un utilisateur et doit généralement être appelé avant l’affichage.

https://bibwild.wordpress.com/2013/12/19/you-never-want-to-call-html_safe-in-a-rails-template/

[modifié en réponse à un commentaire ci-dessous]

Et 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] 

Comme le suggèrent certaines des réponses ci-dessus, Rails peut être en train d’échapper à votre code avant d’être rendu au format HTML. Voici un exemple qui résout ce problème (en premier lieu en désinfectant les entrées, afin que vous puissiez appeler “en toute sécurité” html_safe sur 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 de sanitize si vous ne faites pas confiance aux entrées.