Rails'de - yeni satırları <br>'ye dönüştürmek için bir ray yöntemi var mı?


115

Dönüştürme yapmanın Railsy bir yolu var mı <br>?

Şu anda bunu şöyle yapıyorum:

mystring.gsub(/\n/, '<br>')

İki / karakter ne yapar?
Onun

İki / karakter bunun normal bir ifade olduğunu gösteriyor
joshua.

Yanıtlar:


260

Evet, raylarda simple_formattam olarak aradığınız şeyi yapan ve paragraf etiketleri de eklediği için biraz daha iyi vardır. Görmek

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

Misal:

 simple_format(mystring)

Not simple_formattemel HTML etiketlerini izin verir, ama aynı zamanda içinden metni geçer sanitizeo kullanıcı girişi için güvenli olmalıdır, böylece tüm komut dosyalarını kaldırır hangi.


1
Teşekkürler - Bunu bilmeliydim - Diğer projelerde simple_format kullandım.
daustin777

3
Bu noktaya dikkat edilmelidir simple_formatotomatik sağlanan metin sarar <p>etiketler ve bu işlevsellik kaçınılması edilemez.
Isaac Moore

1
simple_format, bir web uygulaması için kullanıyorsanız güvenlik riskidir. javascript:alert(\no!\)Referansta verildiği gibi özel sözdizimini yorumlayan Rails'e dayanır . Kötü niyetli bilgisayar korsanlarının birlikte çalışabileceği sonsuz varyasyonlar ve gelecekteki varyasyonlar olabilir.
Chloe

3
raylar 4 olduğundan, simple_format başka herhangi bir şey için etiketi wrapper_tagdeğiştirmeye izin veren bir seçeneğe sahiptir<p>
Lluís

41

Şunları yaparak daha genel hale getirebilirsiniz:

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

Bu şekilde DOS, * NIX, Mac ve yanlışlıkla geçersiz satır sonlarını kapatmış olursunuz.


5
Genelleştirilmiş, Rails olmayan çözüm için +1. Rails'i sevmeyen bir Ruby geliştiricisi olarak bunlardan çok azı var.
Winfield Trail

3
Güzel normal ifade, teşekkürler. Kendinize benzer bir şey yapmak simple_formatistiyorsanız, o normal ifadeye bölünebilir map, dizeleri açılış ve kapanış petiketlerinde sarmalamak için kullanın ve ardından onlara katılın. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.jointest etmemiş olsam da yapmalıyım.
Brian Kung

Mükemmel numara @ BrianKung tam olarak aradığım şeydi!
alexventuraio

Görüntülemek bir raylar üretilen html etiketleri güvenli yapmak istiyorsanız Ayrıca, sadece böyle bir şey yapmak ve aynı zamanda her oluşturulan öğe için bir sınıf ekleyebilirsiniz: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. Ve bir çekicilik gibi çalışıyor, boohoo!
alexventuraio

Bu cevaba oldukça olumlu oy verilmiş olsa da, bunun siteler arası komut dizisine açık olduğunu eklemek istiyorum. Bunu yalnızca girdiye güvenirseniz yapabilirsiniz (yani kullanıcı girdisi yoksa). Aksi takdirde mystringkeyfi HTML içerebilir.
NobodysNightmare

29

Kullanıcı girdisiyle uğraşırken buna dikkat etmelisiniz. etiketleri
simple_formatekler, <br>ancak diğer html etiketlerine izin verir !

Simple_format kullanıldığında, <b>Hello</b>" Merhaba " olarak görüntülenecektir, bunu istemeyebilirsiniz.

Bunun yerine <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()html'yi kodlayacak, gsubsatır sonunu değiştirecek ve etiketlerin görüntülenmesine html_safeizin vereceksiniz <br>.

Bu, kullanıcının tam olarak ne girdiğini gösterecektir. Ayrıca html'yi yorumlarda tartışmaya da izin verir.


Evet. bunun gibi çalışıyor ve çıktının tıpkı input gibi, gösterilen dönüşlerle olmasını istiyorum.
Tim

simple_formatTemel HTML etiketlerine izin verirken , metni de ilettiğini ve sanitizebu da potansiyel olarak kötü niyetli olabilecek her şeyi ortadan kaldırdığını unutmamak önemlidir . apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

Temizlenmiş HTML'nin bile temel bağlantılara izin verdiğini unutmamak önemlidir. Kullanıcıları kimlik avı sitesine yönlendirmek için bir bağlantı kullanılabilir. Uygulamanız tarafından gönderilen bir e-postada kullanıcı tarafından oluşturulan bir mesajı görüntülüyorsanız, buna özellikle dikkat etmelisiniz.
James

17

Basitçe kullan

white-space: pre-line;

css ve metin satır sonlarında kaydırılır.


Evet, sadece basit_format, çeşitli satırsonlarının birleştirilmiş olması gibi uç durumlarda işe yaramıyor. örneğin \ r \ n \ r \ n
emaxi

1
Tam olarak OP'nin istediğini yapan ve başka bir şey yapmayan güzel ve zarif bir çözüm - html etiketli metinler html olarak işlenmeyecek. benim durumumda çıktının girişle tam olarak eşleşmesini istedim (örneğin, <b> </b> metni kalın göstermeyecek.
David

1

Ayrıca ne yapmaya çalıştığınızı da düşünebilirsiniz - insanların girdiği metni güzel bir şekilde biçimlendiriyorsanız , kullanıcılarınızın HTML olan solucan kutusunu açmadan metinlerini biçimlendirmelerine izin veren Markdown gibi bir filtre düşünebilirsiniz . Bilirsiniz, Stack Overflow'da olduğu gibi.


0

Hayır! Orada sahip olduğunuz şey, yaygın olarak kullanılan alternatiftir. Çoğu insanın kullandığı tanım şudur:

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

Bu şekilde adlandırılmıştır çünkü PHP işlevinin işlevselliğini aynı adla taklit eder .


1
Olumsuz oy vermedim, ancak onları şu şekilde açıklardım: Simple_format gibi bir şeyi hesaba katmayan bir yanıt rahatsız edici görünmüyor, ancak kesin bir "Hayır" ile yanıt veriyor. başlangıçta insanları daha ileriye bakmaktan caydırır.
cesoid

0
mystring.gsub(/\r\n|\r|\n/, '\n')

benim için çalıştı


0

Yapabilirsin simple_format(h(text))-h herhangi bir HTML'nin işlenmemesini sağlar.

Diğer yanıtlarda da belirtildiği gibi, bu, istediğinizden biraz daha fazlasını yapacaktır. Her şeyi içine alır <p>ve herhangi bir yerde çift satırsonu varsa daha fazla paragraf ekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.