前提・実現したいこと
railsでアプリを作成中です。コメントの削除機能はdestroyアクションで動作をします。これをAjaxを使用して非同期で動作するようにもっていきたいです。コメントの投稿はAjaxを使って実装済みです。初学者で申し訳ありませんが、アドバイスなどいただけますでしょうか?
コメントの削除機能をAjaxを用いて実装しようとしていますが、エラーどころかconsole上でイベント発火もしていない状況です。。。
状況としては下記の通りです。
①create(投稿)とdestroy(削除)でjsファイルをわけています。
②destroyのAjaxはイベント発火せず、リロードして削除されてしまいます(検証→consoleに何も表示されず)
③createのAjax実装はできており、動作も問題なくできていますのでAjaxの準備はできています。
発生している問題・エラーメッセージ
エラーどころか、イベントも発火していない状況です。。。。
下記コードを表示しますのでよろしくお願いします。
該当のjsソースコード
(comment_destroy.js)
js
1$(function () { 2 $('.Review-wrapper__list').on('click', ".Review-infomation__right--trash", function (e) { 3 e.preventDefault(); 4 e.stopPropagation(); 5 let url = $(this).attr("href"); 6 $.ajax({ 7 url: url, 8 type: "POST", 9 data: { 10 _method: "delete", 11 }, 12 dataType: "json" 13 }) 14 .done(function(data) { 15 $(".Review-wrapper__list" + data.id + data.job_id).remove(); 16 }) 17 }) 18}); 19
該当のソースコード(コントローラー)
(ReviewController)
rails
1class ReviewsController < ApplicationController 2 def create 3 @review = Review.create(review_params) 4 respond_to do |format| 5 format.html { redirect_to "/matches/#{@review.job_id}.reviews" } 6 format.json 7 end 8 end 9 10 def destroy 11 @review = Review.find_by(id: params[:id], job_id: params[:job_id]) 12 respond_to do |format| 13 if @review.present? 14 @review.destroy 15 format.html { redirect_to "/matches/#{@review.job_id}.reviews" } 16 format.json { render json: { id: params[:id], job_id: params[:job_id]} } 17 end 18 end 19 end 20 21 private 22 def review_params 23 params.require(:review).permit(:good, :bad).merge(user_id: current_user.id, job_id: params[:job_id]) 24 end 25end
該当のソースコード(html.haml)
下記コードが投稿されたコメント(口コミ)です。
削除したいクラスは「.Review-wrapper__list」の中身全体です。
rails
1.Review-wrapper 2 みんなの口コミ!(会社・仕事) 3 .Review-wrapper__title 4 - @reviews.each do |review| 5 .Review-wrapper__list 6 .Review-top 7 .Review-icons 8 .Reiview-icons__face 9 =image_tag current_user.image.to_s, class: 'Review-icons__face--image' 10 .Review-icons__nickname 11 =current_user.nickname 12 .Review-time 13 =review.updated_at 14 15 .Review-infomation 16 .Review-infomation__left 17 .Review-infomation__left--good 18 【よかった点】 19 .Review-infomation__left--text 20 =review.good 21 .Review-infomation__left--good 22 【わるかった点】 23 .Review-infomation__left--text 24 =review.bad 25 .Review-infomation__right 26 .Review-infomation__right--destroy 27 = link_to job_review_path(review.job.id, review.id), method: :delete do 28 =icon('far','trash-alt', class: 'Review-infomation__right--trash')
参考:createアクションのAjaxコード
(comment.js) (一応記載させてもらいます)
$(function () { function buildHTML(comment) { let html = `<div class="Review-wrapper__list"> <div class="Review-top"> <div class="Review-icons"> <div class="Review-icons__face"> <img class="Review-icons__face--image" src = "${comment.image}"> </div> <div class="Review-icons__nickname"> ${comment.user_name} </div> </div> <div class="Review-time"> ${comment.created_at} </div> </div> <div class="Review-infomation"> <div class="Review-infomation__left"> <div class="Review-infomation__left--good"></div> 【よかった点】 <div class="Review-infomation__left--text"> ${comment.good} </div> <div class="Review-infomation__left--good"></div> 【わるかった点】 <div class="Review-infomation__left--text"> ${comment.bad} </div> </div> <div class="Review-infomation__right"> <div class="Review-infomation__right--destroy"> <a rel="nofollow" data-method="delete" href= "/jobs/${comment.job}/reviews/${comment.review_id}"><i class="far fa-trash-alt Review-infomation__right--trash"></i></a> </div> </div> </div> </div>` return html; } $('#new-comment').on('submit', function (e) { e.preventDefault(); console.log(this) let formData = new FormData(this); let url = $(this).attr('action') $.ajax({ url: url, type: "POST", data: formData, dataType: 'json', processData: false, contentType: false }) .done(function (data) { let html = buildHTML(data); console.log(html) $('.Review-wrapper__title').append(html); $('#new-comment')[0].reset(); $('.Review-button__submit').prop('disabled', false); }) }) });
該当のjbuilder
(create.json.builder)
rails
1json.good @review.good 2json.bad @review.bad 3json.image @review.user.image.url 4json.user_id @review.user.id 5json.user_name @review.user.nickname 6json.created_at @review.created_at.strftime("%Y年%m月%d日 %H時%M分") 7json.job @review.job.id 8json.review_id @review.id
試したこと
イベントが発火していないということは対象のclassが間違っているとも思ったので何回かクラスを変えてみました。
状況が似ている記事の中でも、下記の記事を参考にさせていただき解決に向かおうとしました。
①https://qiita.com/t-yama-3/items/7148d25b17e70ceb48d6#2-1-1-3-failfunction-
②https://qiita.com/sakuraniumarete/items/9eed397eb3597dcdb952
補足情報(FW/ツールのバージョンなど)
rails
1ruby '2.6.5' 2 3# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 4gem 'rails', '~> 6.0.0' 5# Use mysql as the database for Active Record 6gem 'mysql2', '>= 0.4.4' 7# Use Puma as the app server 8gem 'puma', '~> 3.11' 9# Use SCSS for stylesheets 10gem 'sass-rails', '~> 5' 11# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker 12gem 'webpacker', '~> 4.0' 13# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks 14gem 'turbolinks', '~> 5' 15# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 16gem 'jbuilder', '~> 2.7' 17 18省略 19 20gem 'jquery-rails' 21 22
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。