Подтвердить что ты не робот

Rails 3: Как правильно отобразить текст из "textarea"?

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

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

Интересно, что это самый подходящий способ справиться с этим.

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

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

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

4b9b3361

Ответ 1

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

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

Тогда, по вашему мнению, вы можете использовать его следующим образом:

<%= nl2br(h(@forum_post.message)) %>

Ответ 2

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>"

Ответ 3

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

Ответ 4

Если кто-то по-прежнему перенаправляется сюда и использует 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>"

Ответ 5

Только для CSS-опции

Я считаю, что одним из самых простых вариантов является использование 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:

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

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

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

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

pre tag

white-space

Ответ 6

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

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

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

<%= with_new_lines @object.some_text %>

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

Итак, я решил это с помощью

render :layout => false