dmchyd42
@dmchyd42 (武蔵)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

非同期で表示させた削除ボタンを使用したい。ルーティングのエラーが出ます。

解決したいこと

非同期化させて表示させたビューの削除ボタンを押せるようにしたい
例)
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

1Answer

- <form acttion= "/shoppings/${shopping.id}" method="post" "shopping_path" >
+ <form action="/shoppings/${shopping.id}" method="post" "shopping_path" >
1Like

Comments

  1. @dmchyd42

    Questioner

    ご回答頂き有難うございます!
    actionのスペル間違いでした。
    本当に助かりました!!!

Your answer might help someone💌