【Ruby on Rails】truncateメソッドでテキストを省略するとき、「”…”を除いた文字数」を指定する方法

Rails・Webシステム開発
Anja🤗#helpinghands #solidarity#stays healthy🙏によるPixabayからの画像
スポンサーリンク



前提

Ruby on Railsで記事投稿システムの作成。

Articleテーブル(記事)にtextカラム(本文)があり、1万文字まで保存可能。

記事一覧では、本文を省略して最初の100文字まで表示する。

やりたいこと

article.textが101文字以上の場合は、100文字目まで表示、101字以上を省略して代わりに”…”で表現したい。

12345678901234567890(途中省略)1234567890...

最後の0がちょうど100文字目です。

困ったこと

テキストを省略するには、truncateメソッドを使えば良いみたいですね!

Railsのtruncateの使い方を参考にしました。)

早速使ってみると、

article.text.truncate(100)
# => "12345678901234567890(途中省略)1234567..."

あれ、97文字しか表示されない・・・

どうやらtruncateメソッドは、「”…”も含めて」表示する文字数を指定できるみたいですね。

じゃあ、予め逆算しておいて、こう書いておくか。

article.text.truncate(103)
# => "12345678901234567890(途中省略)1234567890..."

“…”は含まずに、ちゃんと100文字表示されました。

なんか103って書くの気持ち悪いけど、とりあえず動くならいいか・・・

と思っていたら!

# article.textが102文字のとき
article.text.truncate(103)
# => "12345678901234567890(途中省略)123456789012"

102文字丸々表示されてしまう!!

これだとテキストの文字数が101, 102, 103文字のときは全部表示されてしまうことが判明。(そりゃそう)

なんかオプションか何かで「”…”を除いた文字数」を指定する方法はないものか・・・

解決策

結局、良い方法は見つからず、ビューヘルパーでカスタムメソッドを作ってしまいました。

  article_helper.rb

  def truncate_just(text, length)
    return text if text.blank? || length.blank? || text.length <= length
    text.truncate(length, omission: '') + '...'
  end


# article.textが102文字のとき
truncate(article.text, 100)
# => "12345678901234567890(途中省略)1234567890..."

ちゃんと”…”を除いて100文字表示されました。

もっとスマートな方法があれば教えてください。(一応、これでちゃんと表示できます。)

(2022/3/13 ビューヘルパーに、nil回避の記述を追加しました。)

はるすと
はるすと

最後まで読んでくださってありがとうございました!

画像提供:Anja🤗#helpinghands #solidarity#stays healthy🙏によるPixabayからの画像

この記事を書いた人
こもれびエンジニア

自然と自由を愛するエンジニア。2021年1月に、大手製造業設計からプログラマ(Rails, AWS)へ転職。動物や自然との触れ合いや、汗を流すのが好き。

/HSP(繊細さん)/18デリケートな象/ストレングスファインダー(1分析思考/2親密性/3学習欲/4調和性/5収集心)、テニス、合気道、登山、あいだみつを、ジブリ、ワンピース、ドラゴンボール、AWS、Ruby on Rails、アイミング

twitterをフォローして、記事にならないちょっとした豆知識もチェック!
Rails・Webシステム開発
スポンサーリンク
SNSでシェア/コメントして、自分のアウトプット/発信力を高めるのにお使いください。 ↓ 各ページへジャンプ ↓
twitterをフォローして、記事にならないちょっとした豆知識もチェック!
スポンサーリンク
「そんなか」サイト

コメント

タイトルとURLをコピーしました