目的
- 勉強の実施時間を記録するwebアプリ作成の際に数値のinputで詰まり、コミュニティの方に助けていただいた話をまとめる
- そもそもセオリーを理解できていなかったので二度とこんなことない様にまとめる。
-
.to_i
を使って数値に変換できることはなんとなく知識としてあったが定着していなかったのでまとめる。
目標
- すでにDBに格納されている数値に入力数値を足してDBに格納する。
- 不動小数点や符号などはとりあえず考えず前述の目標をクリアする。
結論
- 教えていただいた現役エンジニアさんのお言葉「入力値はtype指定してもStringになってしまうので受け取った側で型を指定して変換する」
問題のコード
-
下記に問題のコードの一部を抜粋する。
-
コントローラ
def update @post = Post.find_by(id: params[:id]) @post.study_time = @post.study_time + params[:study_time] @post.save redirect_to("/posts/#{@post.id}") end
-
ビュー
<%= form_tag("/posts/#{@post.id}/update") do %> <p>今日つみかさねた時間</p> <input type="number" name="study_time"> <input type="submit" value="今日のつみかさね登録"> <% end %>
詰まったところまでの概要
-
前述の問題のコードにて「今日のつみかさね登録」ボタンを押したところ下記のエラーが出た。
no implicit conversion of integer into string
-
エラーの内容から足そうとしている数値の型があっていないことがわかった。
-
筆者はビューファイルの
input
でtype="number"
を指定して入力型を数値にしようと試みたが同じエラーが出た。 -
解決しようと試みたがいろいろ試してくうちに混乱してしまった。
解決方法
- コントローラで受け取った値の型を数値に変換すことにより問題は解決した。
正常動作したコード
-
下記に教えていただいた内容を元に修正を行なったコードを記載する。
-
コントローラ
def update @post = Post.find_by(id: params[:id]) @post.study_time = @post.study_time + params[:study_time].to_i @post.save redirect_to("/posts/#{@post.id}") end
-
ビュー
<%= form_tag("/posts/#{@post.id}/update") do %> <p>今日つみかさねた時間</p> <!-- type="number"だと0~9までの入力しか受け付けられないためおって修正が必要 --> <input type="number" name="study_time"> <input type="submit" value="今日のつみかさね登録"> <% end %>
反省
-
.to_i
で数値に変換できることは知ってはいたが使いどころが理解できてなかった。 - そもそもセオリーを理解できていなかった。
- 今考えると諦めなければ自己解決できたかもしれない。
よかったこと
- エラー文をコピペで解決することをしなかった。
- エラー文から問題箇所を特定することができた。