Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Railsの技: excerptヘルパーでテキストの一部を抜粋する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Railsの技: excerptヘルパーでテキストの一部を抜粋する(翻訳)

Railsのexcerptヘルパーは、テキストの中から特定のフレーズにマッチするチャンク(chunk: 小さな塊)を抜粋します。フレーズは文字列のどこにあっても構いません。

たとえば、特定の検索語句とマッチするメールのリストを表示したいとしましょう。

こんなときは、レコードをフィルタしてからメール本文に対してexcerptを実行します。

利用法

仮に、以下のようなビューでこの機能を作るとしましょう。

<%= link_to email do %>
  <div class="flex justify-between items-center">
    <p class="text-sm font-medium text-gray-900">
      <%= email.sender_name %>
    </p>
    <%= local_time_ago email.received_at %>
  </div>
  <p class="text-sm text-gray-700">
    <%= email.subject %>
  </p>
  <p class="text-sm text-gray-500">
    <%= excerpt(email.body.to_plain_text, params[:q], radius: 15) %>
  </p>
<% end %>

Action Textを使っている場合はto_plain_textを呼んでおくのがポイントです(さもないとHTMLタグが閉じないままになる可能性があります)。一般にリッチテキストの抜粋を表示する場合は、書式設定を抜粋全体には適用しないでしょう。

excerptヘルパーを以下のhighlightヘルパーと組み合わせると、さらにいい感じになります。

Railsの技: highlightヘルパーで検索結果を強調表示する(翻訳)

オプション(1)

@product.description = "A one-of-a-kind vintange DHH coffee mug signed by the man himself!"

excerpt(@product.description, "coffee", radius: 10)
=> "...tange DHH coffee mug signe..."

excerptヘルパーは大文字小文字を区別しません。正規表現を渡すこともできます。

@product.description = "A one-of-a-kind vintange DHH coffee mug signed by the man himself!"

excerpt(@product.description, "COFFEE", radius: 10)
=> "...tange DHH coffee mug signe..."

excerpt(@product.description, /tea|coffee/, radius: 10)
=> "...tange DHH coffee mug signe..."

オプション(2)

radius:オプションは、マッチした箇所の前後何文字を抜粋するかを指定します(デフォルトは100)。

@product.description = "A one-of-a-kind vintange DHH coffee mug signed by the man himself!"

excerpt(@product.description, "coffee", radius: 5)
=> "...DHH coffee mug..."

excerpt(@product.description, "coffee", radius: 25)
=> "...e-of-a-kind vintange DHH coffee mug signed by the man hi..."

省略を表す...を変更したい場合は、omission:オプションで指定します。

@product.description = "A one-of-a-kind vintange DHH coffee mug signed by the man himself!"

excerpt(@product.description, "coffee", radius: 10)
=> "...tange DHH coffee mug signe..."

excerpt(@product.description, "coffee", radius: 10, omission: "---")
=> "---tange DHH coffee mug signe---"

excerpt(@product.description, "coffee", radius: 10, omission: "<snip>")
=> "<snip>tange DHH coffee mug signe<snip>"

参考資料

Rails APIドキュメント: TextHelper#excerpt

Rails APIドキュメント: ActionText#to_plain_text

関連記事

Railsの技: pluckはActive RecordモデルでもEnumerableでも使える(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。