Форматирование заполненного текстового поля, возврата каретки, новой строки и HAML

Когда я заполняю текстовое поле текстом с помощью \r\n (возврат каретки - новая строка), текст форматируется неправильно [ОБНОВЛЕНИЕ: \r\n — это то, что генерируется при заполнении текстового поля, я просто извлекаю из базы данных то, что было ранее заполненный. Также следует отметить, что в производственной среде у меня, похоже, нет этой проблемы. КОНЕЦ ОБНОВЛЕНИЯ] Например:

%textarea  
  = "hello\r\nHow are you?"

выходит так:

hello  
        How are you?

Я думаю, что это может иметь какое-то отношение к HAML. Может кто-нибудь мне помочь? Примечание: если я использую \n\r, он работает нормально, но это технически неверно, и id должен выполнить некоторые gsubs, чтобы изменить их для правильного отображения.


person Michael    schedule 18.06.2010    source источник
comment
Есть ли пробелы/возврат каретки в теге textarea? Например. <textarea> foo </textarea>.   -  person mechanical_meat    schedule 18.06.2010
comment
Да, когда я смотрю исходник, между первой и второй частями есть куча пробелов.   -  person Michael    schedule 18.06.2010
comment
обычно в строках вы просто используете "\n" для новой строки. Разве это не работает?   -  person nathanvda    schedule 19.06.2010
comment
\r\n — это то, что отправляется, когда кто-то заполняет текстовое поле разрывами строк.   -  person Michael    schedule 19.06.2010


Ответы (4)


Поскольку Haml автоматически делает отступы в исходном коде HTML, содержимое тегов, чувствительных к пробелам, таких как pre и textarea, может быть искажено. Решение состоит в том, чтобы заменить новые строки внутри этих тегов сущностями новой строки HTML &#x000A;, что делает Haml с помощью помощников Haml::Helpers#preserve и Haml::Helpers#find_and_preserve.

Обычно Haml делает это за вас автоматически, когда вы используете тег, которому это нужно (это можно настроить с помощью опции :preserve). Например,

%p
  %textarea= "Foo\nBar"

будет скомпилирован в

<p>
  <textarea>
Foo&#x000A;Bar</textarea>
</p>

Однако, если хелпер генерирует тег, Haml не может это обнаружить, поэтому вам придется вызывать Haml::Helpers#find_and_preserve самостоятельно. Вы также можете использовать ~, который аналогичен =, за исключением того, что он автоматически запускает find_and_preserve на входе. Например:

%p= find_and_preserve "<textarea>Foo\nBar</textarea>"

такой же как

%p~ "<textarea>Foo\nBar</textarea>"

и оказывает

<p><textarea>Foo&#x000A;Bar</textarea></p>

Источник: эти вопросы и ответы по Haml.

person Natalie Weizenbaum    schedule 18.06.2010
comment
nex3, ОГРОМНОЕ спасибо! (можно тебя обнять?) :D. .gsub("\n",'&#x000A;').html_safe - person lokson; 14.04.2015
comment
Вы также можете использовать вспомогательную функцию text_area Rails: = find_and_preserve f.text_area :title - person Ryan Crispin Heneise; 03.01.2017
comment
Ответ @thutt лучше: используйте ~, который является псевдонимом для = find_and_preserve... вместо = - person Ryan Crispin Heneise; 03.01.2017

Краткий ответ, если = f.text_area :foo отображает нежелательные пробелы в каждой новой строке:

замените = на ~

Для более подробного объяснения причин этого прочитайте ответ Натали и Документация по HAML о ~.

person thutt    schedule 10.12.2016

Продолжая ответ @nex3, если вы хотите сделать многострочный контент внутри текстовой области, попробуйте сделать это следующим образом:

%textarea#textarea_id{:name => 'area_name'}
  :preserve
    Line1
    Line2
    Line3
    Line4
    Line5
person Zack Burt    schedule 20.03.2015

Изменение

%textarea  
  = "hello\r\nHow are you?"  

to

%textarea "hello\r\nHow are you?"

все в одной строке, похоже, решили проблему. Я предполагаю, что это означает, что это была проблема HAML.

person Michael    schedule 18.06.2010