Di Rails - apakah ada metode rails untuk mengubah baris baru menjadi <br>?


115

Apakah ada cara Railsy untuk mengubah \ n menjadi <br>?

Saat ini, saya melakukannya seperti ini:

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

Apa yang dilakukan dua / karakter? Saya menggunakan "sebagai gantinya.
alamodey

Dua / karakter menunjukkan itu
ekspresi

Jawaban:


260

Ya, rel memiliki simple_formatyang melakukan apa yang Anda cari, dan sedikit lebih baik karena juga menambahkan tag paragraf. Lihat

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

Contoh:

 simple_format(mystring)

Perhatikan bahwa simple_formatmemungkinkan tag HTML dasar, tetapi juga meneruskan teks sanitizeyang akan menghapus semua skrip, jadi harus aman untuk masukan pengguna.


1
Terima kasih- Saya seharusnya tahu ini- Saya telah menggunakan simple_format dalam proyek lain.
daustin777

3
Perlu dicatat bahwa simple_formatsecara otomatis membungkus teks yang disediakan dalam <p>tag, dan fungsi ini tidak dapat dihindari.
Isaac Moore

1
simple_format adalah risiko keamanan jika menggunakannya untuk aplikasi web. Ini bergantung pada Rails yang menafsirkan sintaks khusus seperti yang javascript:alert(\no!\)diberikan dalam referensi. Mungkin ada variasi yang tak ada habisnya dan variasi masa depan untuk digunakan oleh peretas jahat.
Chloe

3
sejak rel 4, simple_format memiliki wrapper_tagopsi yang memungkinkan untuk mengubah <p>tag untuk hal lain
Lluís

41

Anda dapat membuatnya lebih umum dengan melakukan:

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

Dengan cara ini Anda akan mencakup DOS, * NIX, Mac dan akhiran baris tidak valid yang tidak disengaja.


5
1 untuk solusi umum non-Rails. Sebagai pengembang Ruby yang tidak menyukai Rails, jumlah ini terlalu sedikit.
Winfield Trail

3
Regex yang bagus, terima kasih. Jika Anda ingin melakukan sesuatu yang mirip dengan simple_formatAnda dapat memisahkan regex tersebut, gunakan mapuntuk membungkus string dalam ptag pembuka dan penutup , lalu gabungkan. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinharus melakukannya, meskipun saya tidak mengujinya.
Brian Kung

Trik luar biasa @BrianKung, itulah yang saya cari!
alexventuraio

Juga jika Anda ingin membuat tag html yang dihasilkan aman di rel melihat, hanya melakukan sesuatu seperti ini dan juga Anda dapat menambahkan kelas untuk setiap item yang dihasilkan: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. Dan itu bekerja seperti pesona boohoo!
alexventuraio

Meskipun jawaban ini mendapat suara positif cukup banyak, saya ingin menambahkan bahwa ini rentan terhadap skrip lintas situs. Anda hanya dapat melakukannya, jika Anda mempercayai masukan (yaitu, tidak ada masukan pengguna). Jika tidak, mystringbisa berisi HTML sembarangan.
NobodysNightmare

29

Anda harus berhati-hati dengan ini ketika Anda berurusan dengan input pengguna.
simple_formatmenyisipkan <br>tag tetapi itu akan memungkinkan tag html lainnya !

Saat menggunakan simple_format, <b>Hello</b>akan ditampilkan sebagai " Halo ", Anda mungkin tidak menginginkan ini.

Sebagai gantinya Anda dapat menggunakan <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()akan menyandikan html terlebih dahulu, gsubmenggantikan jeda baris dan html_safememungkinkan <br>tag untuk ditampilkan.

Ini akan menampilkan dengan tepat apa yang dimasukkan pengguna. Ini juga memungkinkan untuk mendiskusikan html di misalnya komentar.


ya. seperti ini, ini berfungsi dan saya ingin output seperti input, dengan pengembalian yang ditampilkan.
Tim

Meskipun simple_formatmengizinkan tag HTML dasar, penting untuk diperhatikan bahwa tag ini juga melewati teks sanitize, yang menghapus apa pun yang berpotensi berbahaya. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

Penting untuk dicatat bahwa bahkan HTML yang sudah dibersihkan memungkinkan tautan dasar. Tautan dapat digunakan untuk mengarahkan pengguna ke situs phishing. Anda harus sangat berhati-hati dengan ini jika Anda menampilkan pesan yang dibuat pengguna dalam email yang dikirim oleh aplikasi Anda.
James

17

Cukup gunakan

white-space: pre-line;

di css dan teks Anda akan dibungkus saat jeda baris.


Ya, hanya simple_format tidak berfungsi untuk saya untuk kasus tepi seperti memiliki berbagai baris baru yang digabungkan. misalnya \ r \ n \ r \ n
emaxi

1
solusi bagus dan elegan yang melakukan persis apa yang diminta OP dan tidak lebih - teks dengan tag html tidak akan ditampilkan sebagai html. dalam kasus saya, saya ingin output sama persis dengan input (mis. <b> </b> tidak akan menampilkan teks yang dicetak tebal.
David

1

Anda juga dapat mempertimbangkan apa yang Anda coba lakukan - jika Anda memformat teks dengan baik yang telah dimasukkan orang, Anda dapat mempertimbangkan filter seperti Markdown untuk memungkinkan pengguna Anda memformat teks mereka tanpa membuka kaleng worm yang merupakan HTML. Anda tahu, seperti yang ada di Stack Overflow.


0

Nggak. Apa yang Anda miliki di sana adalah alternatif yang umum digunakan. Definisi yang digunakan kebanyakan orang adalah:

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

Dinamakan demikian karena meniru fungsionalitas fungsi PHP dengan nama yang sama .


1
Saya tidak memberi suara negatif, tetapi saya akan menjelaskannya seperti ini: Jawaban yang tidak memperhitungkan sesuatu seperti simple_format tampaknya tidak mengganggu, tetapi jawaban dengan "Tidak" yang pasti. pada awalnya membuat orang enggan untuk melihat lebih jauh.
cesoid

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

bekerja untuk saya


0

Anda dapat melakukannya simple_format(h(text))- ini hakan memastikan HTML apa pun tidak ditampilkan.

Seperti yang disebutkan dalam jawaban lain, ini akan melakukan lebih dari yang Anda minta. Ini membungkus semuanya <p>, dan menambahkan lebih banyak paragraf jika Anda memiliki baris baru ganda di mana saja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.