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>')

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.


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.


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.


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.


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.


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 .


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.