入力したテキストの改行をviewに反映する方法

f:id:naito-coding0322:20180913132958p:plain このように、テキストの改行が反映されるようになります。

simple_formatメソッドを使う

このメソッドは与えられた文字列に対して

文字列を<p>で括る
改行は<br/>を付ける
連続した改行は</p><p>に変換

という処理を行います。

ただ、HTMLタグなどをサニタイズする働きもあるようです。

Railsソースコード

    def simple_format(text, html_options = {}, options = {})
      wrapper_tag = options.fetch(:wrapper_tag, :p)

      text = sanitize(text) if options.fetch(:sanitize, true)
      paragraphs = split_paragraphs(text)

      if paragraphs.empty?
        content_tag(wrapper_tag, nil, html_options)
      else
        paragraphs.map! { |paragraph|
          content_tag(wrapper_tag, raw(paragraph), html_options)
        }.join("\n\n").html_safe
      end
    end


ということは、前回の記事で行ったテキストへの処理が無効化されてしまいます。
(テキスト内のURLがaタグに変換されるようにする - naito-coding0322’s diary)

筆者の場合は、リンクをクリックしたときに別ページでリンク先を開いてほしいのに、 target="_blank"が無効化されてしまい困っていました。


解決方法

オプションでsanitizeをfalseにすることができます!

<%= simple_format(文字列, {}, sanitize: false) %>


前回の記事に反映させると

<%= simple_format(convert_url_into_a_tag(h(@task.description)).html_safe, {}, sanitize: false) %>

これで、文中のURLをaタグに変換したテキストの改行を反映してviewで表示することができました。

もちろんですがsimple_formatのサニタイズをfalseにするのは、その前段階でテキストにhtml_escapeメソッドを使ってユーザーからの入力に対処していることが前提です。