jackの勉強日記

勉強したことをアウトプットするための日記です。

railsアプリでスクロール機能をつける

railsのオリジナルアプリで、記事に対してコメント機能を実装しました。

コメント欄を作成し、その中に投稿したコメントを表示することはできたのですが、

コメントが増えると、コメント欄に収まりきらずどんどん下に表示されてしまいます。

 

解決策ですが、今回はCSSをいじることで簡単に解決しました。

使用するのがoverflowプロパティです。

 

index.html.erb

<div class="comment-form">

  <%= render "commens" %>

</div>

 

applicaion.scss

.comment-form {

overflow:scroll;

}

 

コメントは部分テンプレートにしているので、renderで表示しています。

コメントの親要素のdivタグにcssでoverflow:scroll;を付与すると...

<画像>

このようにきちんとスクロール表示ができるようになりました。

overflowには、scroll以外にも指定ができます。

以下のサイトが参考になりました。

web-camp.io

気になる人は見てみてください。

 

文字列の省略

railsを用いたオリジナルアプリを作成しています。

 

<課題>

投稿の一覧表示にBootstrapのcardを用いているため、文字数が多くなると一つ一つのcardの高さが合わなくなってしまう。

それを回避するために、投稿された記事のテキストが一定の文字数を超えるとそれ以降の文字を省略して表示したい。

 

<解決策>

truncateメソッドを使用することで解決できました。

f:id:jack9145:20210119165423p:plain

こんな感じです。

...で3文字取るので、引数に10を指定すると文字列の7文字目までを表示し、

それ以降を省略します。

ちなみに引数に2や3を指定すると...

f:id:jack9145:20210119165756p:plain

こうなりました。

あまり意味はないですが、気になったので試してみました。笑

 

allow_blank

railsのアプリを作成している中で、正規表現で入力欄にバリデーションをかけていました。

しかし、任意入力欄を空欄でフォームを入力すると

”不正な値です”とエラーメッセージが表示されました。

presence: trueとはしていないのになぜ?と一瞬思いましたが、

正規表現でかけたバリデーションに引っかかっているので当たり前ですね。

 

ググってみるとallow_blankというオプションにたどり着きました。

これはフォームに入力があった場合のみバリデーションをかけるオプションで

今回はこれがallow_blankオプションが使えそうです。

allow_balnk: true としたらうまくいきました。

 

少し別件ですが、入力必須項目でpresence :trueと正規表現の両方をかけた場合に、

空欄でフォームを入力するとエラーメッセージ が2つ出てきました。

これも正規表現の方にallow_blank: trueとすることで解決できました!

created_atの表示変更

railsのオリジナルアプリでグラフを作成していた際に、データが記録された日時をグラフのx軸に表示したかったのですが、<%= @profile.created_at %> とすると、

2021-01-14 17:15:00.749979

が表示されます。

必要なのは2010/01/14のみです。

 

解決策がこちらです。

<%= @profile.created_at.strftime('%Y/%M/%D') %>

こうすると2010/01/14が表示できました。

 

roundメソッド

<課題>

オリジナルアプリでBMIの値を扱うにあたり、計算すると

BMI : 18.352525232315131

のようになってしまうため、少数第2位を四捨五入して表示をさせたい。

 

<解決策>

roundメソッドを使用すると簡単に解決できました。

具体的には

変数名.round()とすることで可能です。

引数に値を渡すことで、四捨五入する桁を指定できます。

3.141592.round(2)  => 3.14

3.141592.round(3)  => 3.142

 

downcase,upcaseメソッド

今日のスクールのドリルの中で初めて学習したメソッドについてです。

 

・downcaseメソッド

str = "Hello"

puts  str.downcase

とすると、出力結果は

helloになります。

 

・upcaseメソッド

これはdowncaseメソッドとは逆に

str = "Hello"

puts  str.upcase

とすると、出力結果は

HELLOとなります。

 

また調べたところ、

文字列に含まれる小文字を大文字に、大文字を小文字にするswapcaseメソッドや、

文字列の頭の小文字を大文字に変える、capitalizeメソッドもあるようです。

新しく出てきたものは、その場でキチンとおさえておきたいですね。

テストコードでのエラー

コメント投稿機能を実装し、テストコードを書いていた際に

Failure/Error: _query(sql, @query_options.merge(options))

ActiveRecord::StatementInvalid:

Mysql2::Error: MySQL client is not connected

というエラーが発生しました。

何回かテストコードを実行するも、毎回エラーが発生するタイミングが違い、理由がよくわかりませんでした。

以前、テストのデータが膨大になるとエラーが発生すると聞いたことがあったので、今回がそのケースでは?と考えましたが、データの量も多くない上に、一応データ取得の際には「N+1問題」に気をつけてincludesメソッドを使用しているので一旦その可能性は排除しました。

別の方向性で調べていくと、読み込み速度が関係しているかもしれないという記事を発見し、その解決策を実行したところ無事エラーが解決しました。

解決策としてはbefore do ~endのなかにsleep(1)と記述することで、テストを1秒毎に実行するようにしました。

備忘録として残します。