前提
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からの画像
コメント