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

プログラミング
Anja🤗#helpinghands #solidarity#stays healthy🙏によるPixabayからの画像



前提

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

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

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

やりたいこと

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

01234567890123456789(途中省略)0123456789...

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

困ったこと

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

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

早速使ってみると、

article.text.truncate(100)
# => "01234567890123456789(途中省略)0123456..."

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

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

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

article.text.truncate(103)
# => "01234567890123456789(途中省略)0123456789..."

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

と思っていたら!

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

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

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

解決策

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

  article_helper.rb

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


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

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

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

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

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

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

はるすとをフォローする
プログラミング
スポンサーリンク
はるすとをフォローする
「そんなか」サイト

コメント

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