Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails:文字列の一部だけエスケープさせずにHTMLとして認識させる方法

はじめに

掲示板のアプリケーション等、特定の文字部分(>>3等)を<a></a>として認識させる方法をメモφ(..)

↓イメージはこういう感じ f:id:madogiwa0124:20170916104509p:plain

やりかた

今回は>>数字を返信用の文字列として扱い、<a></a>でページ内リンクを貼るケースを想定してますφ(..)

  1. 文字列全体をhメソッドを使ってエスケープ
  2. エスケープされた文字列の返信用文字列&gt;&gt;>>に置換
  3. >>数値部を抽出し、リンク用のHTMLを生成し本文に埋め込む
  4. 出力側のViewでhtml_safeで出力

実際のソースコード

hoge_helper.rb

  def format_comment(content)
    # 返信用の文字列を定義
    reply = { char: '>>', escaped: '&gt;&gt;' }
    # コメント本文のHTMLをエスケープ後、返信用の文字列のみをHTMLとして再定義
    content = h(content).gsub(reply[:escaped], reply[:char])
    # 返信先リンク部の取得
    content_arry = content.split(" ")
    target = content_arry.select{ |c| c.include?(reply[:char]) }
    target.each do |t|
      # 返信先リンクHTMLの生成
      to = t.match(/#{reply[:char]}\d+/).to_s
      link_html = link_to to, "#comment_#{to.gsub(reply[:char], '')}"
      # 本文の返信部を返信先リンクHTMLで置換
      content = content.gsub(to, link_html)
    end
    content
  end

index.html.erb

<p><%= format_comment(comment.content).html_safe %></p>

以上

参考

www.rubylife.jp

qiita.com