Rails 3: Как правильно отобразить текст из "textarea"? - PullRequest
37 голосов
/ 02 мая 2011

В своем приложении на Rails 3 я использую textarea, чтобы позволить пользователям писать новое сообщение на форуме.

Однако, когда отображается сообщение, все новые строки выглядят как пробелы (<br /> нет). Может быть, есть другие примеры несоответствия, я пока не знаю.

Интересно, как лучше всего с этим справиться?

Я думаю, что текст, который хранится в базе данных, в порядке (я вижу, например, что < преобразуется в &lt;), поэтому основная проблема - это представление.

Есть ли в Rails встроенные вспомогательные методы для этого?

( simple_format делает что-то похожее на то, что мне нужно, но добавляет <p> тегов, которые я не хочу отображать.)

Ответы [ 9 ]

73 голосов
/ 02 мая 2011

Rails получил вспомогательный метод из коробки, поэтому вам не нужно писать свой собственный метод.

Из документации:

simple_format(text, html_options={}, options={})

my_text = "Here is some basic text...\n...with a line break."

simple_format(my_text)
# => "<p>Here is some basic text...\n<br />...with a line break.</p>"

more_text = "We want to put a paragraph...\n\n...right there."

simple_format(more_text)
# => "<p>We want to put a paragraph...</p>\n\n<p>...right there.</p>"

simple_format("Look ma! A class!", :class => 'description')
# => "<p class='description'>Look ma! A class!</p>"
34 голосов
/ 27 марта 2013

Вы можете использовать style="white-space: pre-wrap;" в теге html, окружающем текст. Это учитывает любые разрывы строк в тексте.

28 голосов
/ 02 мая 2011

Поскольку simple_format не делает то, что вы хотите , я бы сделал простой вспомогательный метод для преобразования строк в <br> s:

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

Тогда, на ваш взгляд, вы можете использовать это так:

<%= nl2br(h(@forum_post.message)) %>
8 голосов
/ 05 января 2016

CSS-only option

Я считаю, что одним из самых простых вариантов является использование css white-space: pre-line;

В других ответах также упоминается использование пробела, но я думаю, что нужно немного большеинформация:

В большинстве случаев вам, вероятно, следует выбрать pre-line вместо pre-wrap.Посмотрите разницу здесь .

Очень важно помнить о white-space, что вы не должны делать что-то вроде этого:

<p style="white-space: pre-line;">
  <%= your.text %>
</p>

Это приведет к дополнительнымпробелы и переносы строк в выводе.Вместо этого перейдите к следующему:

<p style="white-space: pre-line;"><%= your.text %></p>

Альтернатива HTML

Другой способ - заключить текст в теги <pre>.И последнее замечание о моей опции CSS здесь также верно:

<code><p>
  <pre><%= your.text %>

Не отделяйте текст от тегов <pre> с пробелами или переносами строк.

Заключительные мысли

После небольшого приближения к этому вопросу у меня возникает ощущение, что html-подход считается менее чистым, чем css-подход, и мы должны пойти по-css-way.Однако html-путь кажется более совместимым с браузером (поддерживает устаревшие браузеры, но кого это волнует):

предварительный тег

пробел

8 голосов
/ 08 февраля 2014

Если кто-то все еще перенаправляется сюда и использует Rails 4: http://apidock.com/rails/v4.0.2/ActionView/Helpers/TextHelper/simple_format

Теперь вы можете указать тег, в который он будет помещен (по умолчанию p), например:

simple_format(my_text, {}, wrapper_tag: "div")
# => "<div>Here is some basic text...\n<br />...with a line break.</div>"
3 голосов
/ 06 июня 2015

Я только что использовал white-space: pre-line. Поэтому следующая строка (\ n) отобразит его.

3 голосов
/ 19 июля 2013

Следующий помощник сохраняет новые строки как разрывы строк и отображает любой HTML или скрипт (например, Javscript) в виде простого текста.

def with_new_lines(string)
   (h(string).gsub(/\n/, '<br/>')).html_safe
end

Использовать как в представлениях

<%= with_new_lines @object.some_text %>
2 голосов
/ 02 мая 2011

Вам нужно будет преобразовать обычный текст текстовой области в HTML.

На самом базовом уровне вы можете выполнить замену строки:

 message_content.gsub! /\n/, '<br />'

Вы также можете использоватьспециальный формат, например Markdown (библиотека Ruby: BlueCloth ) или Textile (библиотека Ruby: RedCloth ).

0 голосов
/ 20 января 2017

Я использовал редактор кода Ace в своем приложении rails, и у меня была проблема, что всякий раз, когда я обновляю или создаю код, он всегда добавляет дополнительную TAB в каждую строку (кроме первой).Я не мог решить это с заменой gsub или javascript. Но он случайно решил сам, когда я отключил макет для этого шаблона.

Итак, я решил это с

render :layout => false
...