Em Rails - existe um método rails para converter novas linhas para <br>?

115

Existe uma maneira Railsy de converter \ n para <br>?

Atualmente, estou fazendo assim:

mystring.gsub(/\n/, '<br>')
daustin777
fonte
O que os dois personagens / fazem? Eu uso "em vez disso.
alamodey
Os dois caracteres / indicam que é uma expressão regular
joshua.paling

Respostas:

260

Sim, o rails tem o simple_formatque faz exatamente o que você está procurando, e um pouco melhor, pois também adiciona tags de parágrafo. Vejo

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

Exemplo:

 simple_format(mystring)

Observe que simple_formatpermite tags HTML básicas, mas também passa o texto sanitizeque remove todos os scripts, por isso deve ser seguro para entrada do usuário.

Daniel Von Fange
fonte
1
Obrigado, eu deveria saber disso, eu usei o simple_format em outros projetos.
daustin777,
3
Deve-se observar que simple_formatenvolve automaticamente o texto fornecido em <p>tags, e que esta funcionalidade não pode ser evitada.
Isaac Moore
1
simple_format é um risco de segurança se usado para um aplicativo da web. Ele se baseia na interpretação do Rails de sintaxe especial, javascript:alert(\no!\)conforme fornecido na referência. Pode haver infinitas variações e futuras variações para hackers mal-intencionados trabalharem.
Chloe
3
desde o rails 4, simple_format tem a wrapper_tagopção que permite mudar a <p>tag para qualquer outra coisa
Lluís
41

Você pode torná-lo mais geral fazendo:

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

Desta forma, você cobrirá DOS, * NIX, Mac e terminações de linha inválidas acidentais.

Tomalak
fonte
5
+1 para a solução generalizada não Rails. Como um desenvolvedor Ruby que não gosta de Rails, há muito poucos deles.
Winfield Trail
3
Bom regex, obrigado. Se você quiser fazer algo semelhante a simple_formatvocê pode dividir nessa regex, use mappara envolver as strings nas ptags de abertura e fechamento e, em seguida, junte-as. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joindeve fazer isso, embora eu não tenha testado.
Brian Kung de
Excelente truque @BrianKung era exatamente o que eu procurava!
alexventuraio
Além disso, se você quiser fazer as tags HTML gerado seguro em um trilhos visualizar, basta fazer algo como isso e você também pode adicionar uma classe para cada item gerado: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. E funciona como um charme boohoo!
alexventuraio
Embora essa resposta tenha muitos votos positivos, quero acrescentar que isso é suscetível a scripts entre sites. Você só pode fazer isso se confiar na entrada (ou seja, sem entrada do usuário). Caso contrário, mystringpode conter HTML arbitrário.
NobodysNightmare
29

Você deve ter cuidado com isso ao lidar com a entrada do usuário.
simple_formatinsere <br>tags, mas permitirá outras tags html !

Ao usar simple_format, <b>Hello</b>será processado como " Olá ", talvez você não queira isso.

Em vez disso, você pode usar <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()o codificará o html primeiro, gsubsubstituirá a quebra de linha e html_safepermitirá que as <br>tags sejam exibidas.

Isso exibirá exatamente o que o usuário inseriu. Também permite discutir html em, por exemplo, comentários.

Jomo
fonte
Sim. assim, funciona e eu quero a saída como a entrada, com os retornos mostrados.
Tim
Embora simple_formatpermita tags HTML básicas, é importante observar que também passa o texto sanitize, o que remove qualquer coisa que possa ser potencialmente malicioso. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy
É importante observar que mesmo o HTML limpo permite links básicos. Um link pode ser usado para direcionar os usuários a um site de phishing. Você deve ter um cuidado especial com isso se estiver exibindo uma mensagem gerada pelo usuário em um e-mail enviado pelo seu aplicativo.
James
17

Basta usar

white-space: pre-line;

em seu css e o texto será quebrado nas quebras de linha.

Bershika
fonte
Sim, apenas simple_format não funciona para mim para casos extremos, como ter várias novas linhas concatenadas. por exemplo, \ r \ n \ r \ n
emaxi
1
solução agradável e elegante que faz exatamente o que o OP está solicitando e nada mais - o texto com tags html não será renderizado como html. no meu caso, eu queria que a saída correspondesse exatamente à entrada (por exemplo, <b> </b> não exibirá o texto em negrito.
David
1

Você também pode considerar o que está tentando fazer - se estiver formatando bem o texto que as pessoas inseriram, pode considerar um filtro como o Markdown para permitir que seus usuários formatem o texto sem abrir a lata de worms que é o HTML. Você sabe, como é aqui no Stack Overflow.

Jim Puls
fonte
0

Não. O que você tem aí é a alternativa comumente usada. A definição que a maioria das pessoas usa é:

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

É nomeado assim porque imita a funcionalidade da função PHP com o mesmo nome .

Ryeguy
fonte
1
Eu não votei negativamente, mas explicaria desta forma: uma resposta que não leva em conta algo como simple_format não parece incômoda, mas uma com um "Não" definitivo. no início, desencoraja as pessoas de procurarem mais longe.
cesóide de
0
mystring.gsub(/\r\n|\r|\n/, '\n')

trabalhou para mim


fonte
0

Você pode fazer simple_format(h(text))- oh irá garantir que nenhum HTML seja renderizado.

Conforme mencionado em outras respostas, isso fará um pouco mais do que você pediu. Isso envolve tudo <p>e adiciona mais parágrafos se você tiver novas linhas duplas em qualquer lugar.

Henrik N
fonte