やろうとしたこと
環境:Ruby on Rails 6.1.3.1
データベースに保存されている文字列をviewに表示する際に、表示される文字数に制約をかけて表示したい。
例:
(controller)
def show
@title = あいうえおかきくけこさしすせそ
end
(view)
<%= @title %> => (表示したい内容)あいうえお...
<!-- 先頭5文字だけ表示したい。省略されていたら「...」をつける -->
文字数の表示制限をするために、trancateというメソッドがあるらしいことを知った
https://qiita.com/ishidamakot/items/2e74d980b3a338e4c784
<%= @title.trancate(5) %>
実際にはどうなった?
<%= "abcdefg".truncate(6) %> => abc...(3文字まで)
<%= "あいうえおか".truncate(6) %> => あいうえおか(6文字以上?)
<%= "あいうえおかき".truncate(6) %> => あいう...(3文字まで)
? truncateの値は変わっていないのに、与えられる文字列の長さによって、文字列の省略が起きたり起きなかったりする
truncateの仕様を理解できていないので、挙動を予想することができなかった
どうやって解決したか
truncateはメソッドの内部で文字のbyte数を計算して文字数を数えて処理を行っているらしい。
truncateメソッドは利用せず、byte数を使って文字数の表示制限を試みる。
<%="abcdefg".byteslice(0, 3).scrub('') %> => abc
<%= "あいうえおかき".byteslice(0, 3).scrub('') %> => あ
全角は一文字あたり3byteなので文字数x3の数値を指定する。
これで、文字数で表示制限ができる。
(予想通りの挙動を実現することができた)
参照
https://techacademy.jp/magazine/19631
省略したら「・・・」をつける
バイト数18以上なら省略をするコード
xxx.html.erb
<!-- controllerから渡される変数 title -->
<% title = "なにかしらの文字列" %>
<%if title.bytesize > 18 %>
<%= title.byteslice(0, 18).scrub('')+"..." %>
<% else %>
<%= title %>
<% end %>
次考えること
半角全角が混同する場合の処理については今度考える。