Rails 3: Как правильно отобразить текст из "textarea"?
В моем приложении Rails 3 я использую textarea
, чтобы пользователи могли писать новое сообщение на форуме.
Однако, когда сообщение отображается, все символы новой строки выглядят как пробелы (нет <br />
). Возможно, есть другие примеры несоответствия, я еще не знаю.
Интересно, что это самый подходящий способ справиться с этим.
Я предполагаю, что текст, который хранится в базе данных, в порядке (я вижу, например, что <
преобразуется в <
), поэтому основной проблемой является презентация.
Есть ли встроенные вспомогательные методы в Rails для этого?
(simple_format делает что-то похожее на то, что мне нужно, но добавляет теги <p>
, которые я не хочу появляться.)
Ответы
Ответ 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