Rails: преобразование строк текстового поля в <br/">

У меня есть текстовое поле в моей модели под названием "about", которое я пытаюсь отобразить на странице показа, но ни один из разрывов строк не отображается правильно.

Я пробовал несколько вещей, но код, который я, наконец, приземлился:

<%= (h @template.about).gsub("\n", "<br />") %>

К сожалению, Rails, похоже, избегает желаемого HTML и выводит эти разрывы строк как

Thanks for the fish, guys! Not like I wanted it, but... uh... thanks? &lt;br /&gt;

Как я могу правильно преобразовать текстовые поля "\n" linebreaks в фактический HTML-код очереди? Я уже пробовал простой формат, но безрезультатно...

Я использую Rails 3, а первые несколько строк "about":

Спасибо за рыбу, ребята! Не так, как хотелось, но... э-э... спасибо?
"Я буду судьей этого, - сказал он!
И теперь, более бесполезная копия, поэтому я могу выделить этот странный почерк, который нашел Аманда.
Подождите! Я имел в виду" странную ошибку..."

Ответы

Ответ 1

попробуйте

<%= simple_format @template.about %>

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

Это работает для меня: -\

1.9.3p194 :017 > str = "Thanks for the fish, guys! Not like I wanted it, but... uh... thanks? 
1.9.3p194 :018"> \"I'll be the judge of that,\" he said! 
1.9.3p194 :019"> And now, more useless copy so I can isolate that weird bud that Amanda found. 
1.9.3p194 :020"> Wait! I meant 'weird bug..."
 #=> "Thanks for the fish, guys! Not like I wanted it, but... uh... thanks? \n\"I'll be the judge of that,\" he said! \nAnd now, more useless copy so I can isolate that weird bud that Amanda found. \nWait! I meant 'weird bug..."


1.9.3p194 :021 > simple_format str
 #=> "<p>Thanks for the fish, guys! Not like I wanted it, but... uh... thanks? \n<br />\"I'll be the judge of that,\" he said! \n<br />And now, more useless copy so I can isolate that weird bud that Amanda found. \n<br />Wait! I meant 'weird bug...</p>"

или используя gsub

1.9.3p194 :022 > str.gsub("\n", "<br />") 
 #=> "Thanks for the fish, guys! Not like I wanted it, but... uh... thanks? <br />\"I'll be the judge of that,\" he said! <br />And now, more useless copy so I can isolate that weird bud that Amanda found. <br />Wait! I meant 'weird bug..." 

Ответ 2

<%= (h @template.about).gsub("\n", "<br />").html_safe %>

Помощник h экранирует текст, чтобы вы не оставались открытыми для атак XSS. Как только этот текст будет экранирован, вы можете gsub и объявить новую строку как html_safe.

html_safe не экранирует, это объявление о том, что строка не должна быть экранирована. Но вы хотите избежать исходной строки, если не уверены, что она не содержит ввода пользователя.