0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

truncateを使用した表示文字数制限をしようとしたら上手く行かなかった件

Posted at

やろうとしたこと

環境: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 %>

次考えること

半角全角が混同する場合の処理については今度考える。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?