個人アプリ 学習時間削除機能を追加実装
70日目です。
9日前の個人アプリ発表時には「最低限は実装できたな〜」と感慨に浸っていたのですが、その後気づいちゃいました。
「あれ?学習時間のリセット機能ついてないから、新しく目標立てて学習記録をしたいならアカウント作り直さなきゃいけないじゃん、、、」と。
そんな不便なアプリは使えないので、追加で削除機能をつけました。
実装したアプリ
削除するためのコード
records_controller.rbに追記
def destroy records = Record.where(user_id: current_user.id) records.destroy_all redirect_to action: :index end
内容:
- 現在ログイン中のユーザーのデータをRecordテーブルから全て持ってきて、変数recordsに代入
- 「destroy_all」メソッドで変数recordsに入っているデータを全て削除
- 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カラムに入っているデータをビューで表示できずに終わってしまったので、早めに解決できるよう動きます。