【本日の学習内容:共同開発(非同期通信)】
引き続き、共同開発を進めました。
今日も非同期通信の実装に取り組みました。
質問に答えていただいたことで前進しましたが、
まだ不具合が起きています。
・「視聴済みにする」ボタンを押す(1回目)
非同期で「視聴済みを解除 」ボタンに切り替わる
・「視聴済みを解除 」ボタンを押す(1回目)
非同期で「視聴済みにする」ボタンに切り替わる
・「視聴済みにする」ボタンを押す(2回目)
非同期で「視聴済みを解除 」ボタンに切り替わらない
おかしいと思い、手動でページを再読み込みすると、
動画教材ページから、先頭の動画が1つ消えてしまっていました。(何度か同じことをしたので、現在複数の動画が消えてしまっています。)
そこでwatchesコントローラーを見ると以下のようになっており、
class WatchesController < ApplicationController
def create
@movie = Movie.find(params[:movie_id])
current_user.watches.create!(movie_id: @movie.id)
end
def destroy
@movie = Movie.find(params[:movie_id])
@movie.destroy!
end
end
消してはいけないところをdestroyしてしまっているのが原因だと思いました。
def create
@movie = Movie.find(params[:movie_id])←destroyアクションで消してはいけない
current_user.watches.create!(movie_id: @movie.id)←destroyアクションで消したい
end
そこでdestroyアクションを修正したのですが、以下のような動きになってしまいます。
・「視聴済みにする」ボタンを押す(1回目)
非同期で「視聴済みを解除 」ボタンに切り替わる
・「視聴済みを解除 」ボタンを押す(1回目)
非同期で「視聴済みにする」ボタンに切り替わらない
・手動でページを再読み込みし、「視聴済みを解除 」ボタンを押しても「視聴済みにする」ボタンに切り替わらない
・試したこと1
def destroy
@movie = current_user.watches.find(movie_id: params[:movie_id])
@movie.destroy!
end
・試したこと2
def destroy
@movie = Movie.find(params[:movie_id])
@movie = current_user.watches.find(movie_id: @movie.id)
@movie.destroy!
end
・試したこと3
def destroy
@movie = Movie.find(params[:movie_id])
@movie = Movie.find(movie_id: @movie.id)
@movie.destroy!
end
ここでmovieではなくwatchのほうを消さなければいけないというのがわかり、
以下のように修正したが実現できず。
・試したこと1
def destroy
@movie = Watch.find(params[:movie_id])
@movie.destroy!
end
・試したこと2
def destroy
@movie = Watch.find(movie_id: params[:movie_id])
@movie.destroy!
end
なかなか実現できないけど、
強力なメンターさんがいますし、
楽しいので
諦めません!!