Array.join(“\n”) niet de manier om mee te doen met een nieuwe regel?

Ik heb een array..

[1,2,3,4]

en ik wil een string die alle elementen bevat, gescheiden door een nieuwe regel..

1
2
3
4

maar als ik [1,2,3,4].join("\n")probeer, krijg ik

1\n2\n3\n4

Ik heb het gevoel dat er een duidelijk antwoord is, maar ik kan het niet vinden!


Antwoord 1, autoriteit 100%

Ja, maar als je die string uitprint, staan ​​er nieuwe regels in:

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

Dus het lijkt te bereiken wat je wenst (?)


Antwoord 2, autoriteit 72%

Een subtiele fout die hier kan optreden, is het gebruik van enkele aanhalingstekens in plaats van dubbele. Dat heeft ook tot gevolg dat de nieuwe regels worden weergegeven als \n. Dus

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

is niet hetzelfde als

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

Er is een uitstekende beschrijving van waarom dit het geval is hier.


Antwoord 3, autoriteit 16%

Voor het geval iemand op zoek is naar deze functionaliteit in de ERB-sjabloon, probeer dan dit:

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

Antwoord 4, autoriteit 6%

Probeer dit ook:

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

Antwoord 5, autoriteit 2%

Misschien wil je html_safe niet gebruiken, zoals ajay al zei, afhankelijk van de context. Html-kluis kan een beveiligingsprobleem zijn. Dit hangt af van of de originele invoer eigenlijkhtml-veilig was. HTML-kluis mag niet worden aangeroepen bij invoer rechtstreeks van een gebruiker en moet normaal gesproken vóór de weergave worden aangeroepen.

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

[bewerkt in reactie op reactie hieronder]


Antwoord 6

Zoals sommige van de andere antwoorden hierboven impliceren, ontsnapt Rails mogelijk aan uw code voordat deze wordt weergegeven als html. Hier is een voorbeeld dat dit probleem verhelpt (eerst de invoer zuiveren, zodat u “veilig” html_safeop het resultaat kunt aanroepen):

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

U hoeft alleen sanitizeals u de invoer niet vertrouwt.


Antwoord 7

Wat dacht je hiervan Als je elk element op een nieuwe regel wilt afdrukken..

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

Other episodes