非同期で表示させた削除ボタンを使用したい。ルーティングのエラーが出ます。
Q&A
Closed
解決したいこと
非同期化させて表示させたビューの削除ボタンを押せるようにしたい
例)
Ruby on RailsとjQueryやjavascriptで買い物リストアプリを作っています。
非同期で買い物リストを表示させた際に削除ボタンも表示されますがそれを押すとルーティングのエラーがおきます。
解決方法を教えて下さい。
発生している問題・エラー
出ているエラーメッセージを入力
```No route matches [DELETE] "/"
または、問題・エラーが起きている画像をここにドラッグアンドドロップ。
https://i.gyazo.com/9860f23f4133a8333c931a0ccdcd34b3.png
動画
https://i.gyazo.com/960b0dd6d8180503418389604ad26a7f.mp4
## 該当するソースコード
```言語名←入力するとソースコードにシンタックスハイライトが付きます
ソースコードを入力
shopping.js
$(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 acttion= "/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');
});
});
});
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
.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'
自分で試したこと
検証ツールを使用して削除ボタン記述されているformの内容を記述しましたが、解決できませんでした。非同期で表示させた買い物リストの削除ボタンを使用できるようにしたいです。ルーティングも同期させていたときはプログラムが動いていましたが非同期になるとエラーが出ます。ご回答いただけると幸いです。
0