個人アプリ 学習時間削除機能を追加実装

70日目です。
9日前の個人アプリ発表時には「最低限は実装できたな〜」と感慨に浸っていたのですが、その後気づいちゃいました。 「あれ?学習時間のリセット機能ついてないから、新しく目標立てて学習記録をしたいならアカウント作り直さなきゃいけないじゃん、、、」と。

そんな不便なアプリは使えないので、追加で削除機能をつけました。

実装したアプリ

Image from Gyazo

削除するためのコード

records_controller.rbに追記

def destroy
    records = Record.where(user_id: current_user.id)
    records.destroy_all
    redirect_to action: :index
end

内容:

  1. 現在ログイン中のユーザーのデータをRecordテーブルから全て持ってきて、変数recordsに代入
  2. 「destroy_all」メソッドで変数recordsに入っているデータを全て削除
  3. records/index.html.erbにリダイレクトする

records/index.html.erbに追記

<%= link_to "学習時間リセット", "/users/#{request.url[28, 1].to_i}/records/:id", method: :delete %>

躓いた点

最初、「学習時間リセット」ボタンを押しても学習時間が削除されず、画面だけ元のページにリダイレクトする、という現象が起こっていました。
その時のdestroyアクションの記述は下記のように記述していました。

def destroy
    records = Record.where(id: current_user.id)
    records.destroy_all
    redirect_to action: :index
end

最初はよくわからず放置していたのですが、Ransackによる検索機能が実装できた後に再度取り組んでみたところ、「 binding.pryで調べればいいじゃん」と浮かび、下記で調べました。

  def destroy
    records = Record.where(user_id: current_user.id)
    binding.pry
    records.destroy_all
    redirect_to action: :index
  end
From: /Users/shimizutakaaki/projects/prolike/app/controllers/records_controller.rb @ line 24 RecordsController#destroy:

    22: def destroy
    23:   records = Record.where(id: current_user.id)
 => 24:   binding.pry
    25:   records.destroy_all
    26:   redirect_to action: :index
    27: end

[1] pry(#<RecordsController>)> records
  Record Load (0.3ms)  SELECT `records`.* FROM `records` WHERE `records`.`id` = 5
  ↳ app/controllers/records_controller.rb:24
=> []

何も取ってこれてないやないかい、、、
ここでデータベースを確認したら、原因が分かりました。

user_idが5のレコードはそのままで、record(学習時間)のidの5番が削除されていました

destroyアクションで「records = Record.where(id: current_user.id)」としていたため、user_idではなくidから取ってきてしまっていたんですね。。
idをuser_idに変更したら、無事リセットされるようになりました。

  def destroy
    records = Record.where(user_id: current_user.id)
    records.destroy_all
    redirect_to action: :index
  end

所感

やはり、調べてもよく分からなかったら一度寝かして見るというのは意外と解決に繋がると再認識しました。 またDBからデータを持ってくる際は、「このコードでどこのカラムのデータを持ってこれているか?」をしっかりと考えた上で実装することが大切だと感じたので次に活かします。

参考にしたサイト:

【Rails入門】データを削除する方法(destroy/delete)を確認しよう | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト


本日はチーム開発2週目の初日で、本格的にサーバーサイドを触り始めました。
DBのimage_urlカラムに入っているデータをビューで表示できずに終わってしまったので、早めに解決できるよう動きます。