0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

削除ボタン非同期

Last updated at Posted at 2020-09-13

解決したいこと

非同期で削除ボタンを押せるようにしたいです

発生している問題・エラー

削除ボタンを押すと非同期で消えますが、リロードを押すと戻ってしまします。
出ているエラーメッセージを入力

または、問題・エラーが起きている画像をここにドラッグアンドドロップ。
https://i.gyazo.com/4766d0b4c627e834ebe5db0ce6df7e51.png
動画 
https://i.gyazo.com/9af2c604873ebddf171e459e6279fc14.mp4

該当するソースコード

ソースコードを入力
```shopping.self-021b89f4c047630c99e17566cb93208d49fd6acb78ad1d1e3da49f4936dbbd44.js?body=1:60 Uncaught TypeError: Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.
    at HTMLDivElement.<anonymous> (shopping.self-021b89f4c047630c99e17566cb93208d49fd6acb78ad1d1e3da49f4936dbbd44.js?body=1:60)
    at HTMLDivElement.dispatch (jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:5227)
    at HTMLDivElement.elemData.handle (jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:4879)
(anonymous) @ shopping.self-021b89f4c047630c99e17566cb93208d49fd6acb78ad1d1e3da49f4936dbbd44.js?body=1:60
dispatch @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:5227
elemData.handle @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:4879

localhost/:1 Form submission canceled because the form is not connected

# shopping.js
``` JavaScript 
$(function(){
//JavaScriptのdocumentにあたるのが、$(ドルマーク)です。$のあとにセレクタと呼ばれるHTMLの指定方法を記述することで、HTML要素が取得できます。	
	function buildHTML(shopping){
		let html =
			`<div class="product-list">
				<div class="product-name">
					${shopping.name}
				</div>
				<div class="note">
					${shopping.note}
				</div>
				<div class="date-addend">
					${shopping.created_at}
				</div>
				<form action= "/shoppings/${shopping.id}" method="post" "shopping_path" >
					<input type="hidden"  name="_method" value="delete" >
					<input type="submit" name="commit" value="削除" class="delete-button" data-disable-with="削除">
				</form>
			</div>`
		
			//<form acttion= "${shopping.id}" accept-charset="UTF-8" method="post">
						//<input type="submit" name="commit" value="削除" class="delete-button" data-disable-with="削除">
					//</form>
		return html;		
	}
	//フォームが送信されたら、イベントが発火するようにする
	$('.form').on('submit', function(e){
		//form要素のクラス属性が'.form'となっている。
		//フォームの送信についてonメソッドでイベントをセッティングする際は、form要素自体に設定する.
		e.preventDefault()
		//preventDefault()を使用してデフォルトのイベントを止める。
		let formData = new FormData(this);
		//new FormData(フォーム要素)とすることでFormDataを作成できる。
		let url = $(this).attr('action');
		//ここで、urlを定義する。
		//attrメソッドで要素が持つ指定属性の値を返す。actionを指定しており、属性の値を取得している。action属性にはフォームの送信先のurlの値が入っている。
		//これでリクエスト先のURLを定義。
		$.ajax({
			url: url,
			type: "POST",
			data: formData,
			dataType: 'json',
			processData: false,
    		contentType: false,
		})
		.done(function(data){
			let html = buildHTML(data);
			$('.main-list').append(html)
			$('.form')[0].reset();      
			$('.main-list').animate({ scrollTop: $('.main-list')[0].scrollHeight});
			$('.product-button').prop('disabled', false);
		})
		.fail(function(){
    	alert('error');
		});	
	});	

	$(".product-list").on("click",function() {
		$(this).remove();
		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);
			$('.main-list').append(html)
			$('.product-button').prop('disabled', false);
		})		
  	});
});

#routes.rb

Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root to: 'shoppings#index'
  resources :shoppings,only: [:index, :new, :create, :destroy]
end

#ShoppingsController

class ShoppingsController < ApplicationController
	def index
		@shoppings = Shopping.all
		@shopping = Shopping.new
	end	

	def create
		@shopping = Shopping.create(shopping_params)
		respond_to do |format|
			format.html { redirect_to root_path }
			format.json  
		end
	end	
	
	def destroy
		shopping = Shopping.find(params[:id])
		shopping.destroy
		respond_to do |format|
			format.html { redirect_to root_path }
			format.json  
		end
	end	
		
	private 
	def shopping_params
		params.require(:shopping).permit(:name, :note)
	end	
end

###index.html.haml

ruby.header
	.header-name
		買い物リスト

.main
	.left-side

	.main-list
		- @shoppings.each do |shopping|
			.product-list
				.product-name
					= shopping.name
				.note
					= shopping.note 
				.date-addend
					= shopping.created_at.strftime("%Y年%m月%d日 %H時%M分")
				= form_with model:shopping, method: :delete, local: true do |f|
					= f.submit '削除',class: 'delete-button'
						
	.right-side

.footer
	= form_with model: [@shopping], html: {class: "form"}, local: true do |f|
		= f.text_field :name, class: 'product-name', 'placeholder': '商品名'
		= f.text_field :note, class: 'product-note', 'placeholder': 'メモ'
		= f.submit '追加', class: 'product-button'```

自分で試したこと

removeを使用してDOMの要素は消せていますが、リクエストがサーバーにうまくやりとりがいっておらず、リロードすると戻ってしまいます。ajaxを記述しましたがエラーがおきてしまい、検索し実装しましたが対処がわからず質問させて頂きました。ご回答頂けると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?