В Rails - есть ли метод rails для преобразования новой строки в <br>?


115

Есть ли способ конвертировать \ n в Railsy <br>?

В настоящее время я делаю это так:

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

Что делают двое / персонажей? Вместо этого я использую ".
alamodey

Два символа / указывают на то, что это обычное выражение
joshua.paling

Ответы:


260

Да, у rails есть то, simple_formatчто делает именно то, что вы ищете, и немного лучше, поскольку оно также добавляет теги абзацев. Видеть

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

Пример:

 simple_format(mystring)

Обратите внимание, что simple_formatразрешены основные теги HTML, но также передается текст, через sanitizeкоторый удаляются все сценарии, поэтому он должен быть безопасным для ввода пользователем.


1
Спасибо - я должен был это знать - я использовал simple_format в других проектах.
daustin777

3
Следует отметить, что simple_formatавтоматически переносит предоставленный текст в <p>теги, и этой функции нельзя избежать.
Исаак Мур,

1
simple_format представляет собой угрозу безопасности при использовании в веб-приложении. Он полагается на интерпретацию Rails специального синтаксиса, подобного javascript:alert(\no!\)приведенному в справочнике. Могут существовать бесконечные варианты и будущие вариации, с которыми могут работать злоумышленники.
Хлоя

3
начиная с rails 4, у simple_format есть wrapper_tagопция, позволяющая менять <p>теги на что-нибудь еще
Lluís

41

Вы можете сделать его более общим, выполнив:

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

Таким образом вы охватите DOS, * NIX, Mac и случайные неверные окончания строк.


5
+1 для обобщенного решения, отличного от Rails. Как Ruby-разработчик, который не любит Rails, их слишком мало.
Winfield Trail

3
Хорошее регулярное выражение, спасибо. Если вы хотите сделать что-то похожее на то, что simple_formatвы можете разделить на это регулярное выражение, используйте, mapчтобы обернуть строки в открывающие и закрывающие pтеги, а затем присоединиться к ним. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinдолжен это сделать, хотя я не тестировал.
Брайан Кунг

Отличный трюк @BrianKung, это было именно то, что я искал!
alexventuraio 05

Кроме того, если вы хотите , чтобы сгенерированные HTML - теги в безопасности в рельсах смотреть, просто сделать что - то вроде этого , а также вы можете добавить класс для каждого создаваемого элемента: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. И это работает как шарм буху!
alexventuraio 05

Несмотря на то, что этот ответ получил довольно много голосов, я хочу добавить, что он подвержен межсайтовому скриптингу. Вы можете сделать это только в том случае, если доверяете вводу (то есть не вводите пользователя). В противном случае mystringможет содержать произвольный HTML.
NobodysNightmare

29

Вы должны быть осторожны с этим, когда имеете дело с пользовательским вводом.
simple_formatвставляет <br>теги, но позволяет использовать другие теги HTML !

При использовании simple_format <b>Hello</b>будет отображаться как « Hello », возможно, вам это не нужно.

Вместо этого вы можете использовать <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()будет сначала кодировать html, gsubзаменяя разрыв строки и html_safeпозволяя <br>отображать теги.

Это будет отображать именно то, что ввел пользователь. Это также позволяет обсуждать html, например, в комментариях.


Ага. вот так, он работает, и я хочу, чтобы вывод был таким же, как и ввод, с показанными возвратами.
Тим

Хотя simple_formatдопускается использование основных HTML-тегов, важно отметить, что он также передает текст sanitize, что удаляет все, что потенциально может быть вредоносным. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

Важно отметить, что даже очищенный HTML допускает базовые ссылки. Ссылка может использоваться для перенаправления пользователей на фишинговый сайт. Вы должны быть особенно осторожны с этим, если вы показываете созданное пользователем сообщение в электронном письме, отправленном вашим приложением.
Джеймс

17

Просто используйте

white-space: pre-line;

в вашем css, и текст будет переноситься по разрывам строки.


Да, просто simple_format не работает для меня в крайних случаях, таких как объединение различных символов новой строки. например \ r \ n \ r \ n
emaxi 09

1
красивое элегантное решение, которое делает именно то, что запрашивает OP, и не более того - текст с тегами html не будет отображаться как html. в моем случае я хотел, чтобы вывод точно соответствовал вводимому (например, <b> </b> не будет отображать текст жирным шрифтом.
Дэвид

1

Вы также можете подумать о том, что вы пытаетесь сделать - если вы хорошо форматируете текст, который вводят люди, вы можете подумать о фильтре, таком как Markdown, чтобы ваши пользователи могли форматировать свой текст, не открывая банку червей, которая является HTML. Вы знаете, как будто это здесь, в Stack Overflow.


0

Нет. У вас есть часто используемая альтернатива. Большинство людей используют следующее определение:

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

Он назван так, потому что имитирует функциональность одноименной функции PHP .


1
Я не голосовал против, но я бы объяснил их так: ответ, который не учитывает что-то вроде simple_format, не кажется утомительным, но ответ с категоричным «Нет». вначале отговаривает людей искать дальше.
cesoid

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

работал на меня


0

Вы можете сделать это simple_format(h(text))- это hгарантирует, что любой HTML-код не будет отображаться.

Как упоминалось в других ответах, это сделает немного больше, чем вы просили. Он оборачивает все это <p>и добавляет больше абзацев, если у вас есть двойные символы новой строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.