質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

1527閲覧

【Rails × jQuery】コメントの削除をAjaxを使ってみましたがうまくいきません、アドバイスなどお願いできますでしょうか

jirou6699

総合スコア4

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/09/20 13:49

前提・実現したいこと

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

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

comment_destroy.js

JavaScript

1/* 構成をみるとReview-wrapper__listの下にReview-infomation__right--trashがない 2$('.Review-wrapper__list').on('click', ".Review-infomation__right--trash", function (e) { 3*/ 4 5$('.Review-infomation__right').on('click', ".Review-infomation__right--trash", function (e) { 6

という事ですか?

投稿2020/09/20 15:23

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問