Help us understand the problem. What is going on with this article?

Rails6 数値入力時にtypeをnumberにしたのに数値として扱われず困った話

目的

  • 勉強の実施時間を記録する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 %>
    

詰まったところまでの概要

  1. 前述の問題のコードにて「今日のつみかさね登録」ボタンを押したところ下記のエラーが出た。

    no implicit conversion of integer into string
    
  2. エラーの内容から足そうとしている数値の型があっていないことがわかった。

  3. 筆者はビューファイルのinputtype="number"を指定して入力型を数値にしようと試みたが同じエラーが出た。

  4. 解決しようと試みたがいろいろ試してくうちに混乱してしまった。

解決方法

  • コントローラで受け取った値の型を数値に変換すことにより問題は解決した。

正常動作したコード

  • 下記に教えていただいた内容を元に修正を行なったコードを記載する。

  • コントローラ

    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で数値に変換できることは知ってはいたが使いどころが理解できてなかった。
  • そもそもセオリーを理解できていなかった。
  • 今考えると諦めなければ自己解決できたかもしれない。

よかったこと

  • エラー文をコピペで解決することをしなかった。
  • エラー文から問題箇所を特定することができた。
miriwo
web系のバックエンドの知識を習得中! 2019/07/07~毎日更新中
https://miriwo.hatenablog.com/
boomtechcafe
埼玉県の朝霞台を拠点にエンジニアの勉強会、交流会等のイベントを企画しています! 朝霞台駅か北朝霞駅が全然行けちゃうぜってエンジニアの方がいたら是非! もくもく会とかゲーム大会とかもやれたらな~って思ってます。
https://boom-teck-cafe.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away