目的
- devimal型のカラムに格納されたデータの文字数を取得する方法をまとめる。
経緯
- Rails6のアプリでツイート用のテンプレートを作成したい。
- そのテンプレート内容は140文字以内に制限したい。
- そのテンプレート内容はデータベースの複数の特定カラムに格納されているもので構成される。
- 複数の特定カラムのデータ型はtext型とdecimal型が混在している。
結論
- decimal型のデータの文字数は
.to_s
で一旦文字列に変更してから.length
で文字数を抽出する。
詰まったところ
- decimal型の値を
.length
のみで文字数を抽出しようとした。 - そもそも数値に
.length
メソットは使用できない。
解決方法
-
decimal型の値の文字列は
.to_i
で一旦文字列に変更してから.length
で文字数を抽出した。 -
下記に文字数の抽出方法を記載する。
decimal型の値.to_s.length
今回の具体例
-
下記にテンプレートのビューファイルの内容を記載する。(下記に記載される内容を全て含めて140文字以内にしたい。説明のために空行を入れているため改行は考慮しない。)
<p> <!-- postsテーブルのcontentカラムの内容(text型) --> <%= @post.content %><br> <!-- postsテーブルのtoday_study_timeの内容(decimal型) --> today: <%= @post.today_study_time %> h<br> <!-- postsテーブルのstudy_timeの内容(decimal型) --> total: <%= @post.study_time %> h<br> <!-- postsテーブルのfree_commentの内容(text型) --> <%= @post.free_comment %><br> <!-- postsテーブルのhash_tagの内容(text型) --> #<%= @post.hash_tag %> </p>
-
コントローラファイルで前述のデータベースから取得した値の文字列のトータルを140文字以下になっているかの処理を記載した。
-
下記に処理を記載する。(今回の件を説明することに最小限のコードを記載する)
#ビューから受け取った情報を@postに格納 @post = Post.new(content: params[:content], study_time: params[:'study_time'], today_study_time: params[:'study_time'], hash_tag: params[:hash_tag], user_id: @current_user.id, free_comment: params[:free_comment] ) #変数word_countに各値の文字数を格納する。 word_count = @post.content.length + @post.hash_tag.length + @post.free_comment.length + @post.study_time.to_s.length + @post.today_study_time.to_s.length #word_countが140よりも大きい時にエラーで特定のページにリダイレクトされるような処理などが連なって記載されている。