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ヘルパーと組み合わせると、さらにいい感じになります。
オプション(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
概要
原著者の許諾を得て翻訳・公開いたします。