状況
家計簿アプリをRuby on Railsで作成している初学者です。
アイテム登録と削除機能をjQueryのAjaxを利用して非同期処理で実装しました。
アイテム登録を非同期で作成したあとそのアイテムを非同期を削除しようとするとエラーが起こります。
単体での処理は問題なく動作をするので原因の特定が難しいです。
- 削除→登録 ○
- 削除のみ ○
- 登録のみ ○
- 登録→削除 ✕
希望の動作としては非同期で作成した後でも非同期で削除ができるようにさせたいです。
コード
- ajax部分のjQueryコード
javascript
1$(function(){ 2 function buildHTML(item){ 3 let html = `<li data-delete-li="${item.id}"> 4 <p> 5 ${item.title} 6 </p> 7 <p> 8 ${item.link} 9 </p> 10 <p> 11 ${item.color} 12 </p> 13 <p> 14 ${item.price} 15 </p> 16 <p> 17 ${item.private} 18 </p> 19 <p> 20 ${item.period_long} 21 </p> 22 <p> 23 ${item.period_unit} 24 </p> 25 <p> 26 ${item.first_payment} 27 </p> 28 <p> 29 ${item.description} 30 </p> 31 <a class="edit_item" href="/users/${item.uid}/items/${item.id}/edit">編集</a> 32 <a class="delete_item" data-delete="${item.id}" rel="nofollow" data-method="delete" href="/users/${item.uid}/items/${item.id}">削除</a> 33 </li>` 34 return html; 35 } 36 37 // 作成時の非同期処理 38 $(document).on('submit', '#new_item', function(e){ 39 e.preventDefault(); 40 let formData = new FormData(this); 41 let url = $(this).attr('action'); 42 43 $.ajax({ 44 url: url, 45 type: "POST", 46 data: formData, 47 dataType: 'json', 48 processData: false, 49 contentType: false 50 }) 51 52 53 .done(function(data){ 54 let html = buildHTML(data); 55 $('#result').append(html); 56 $('#result').animate({ scrollTop: $("#result")[0].scrollHeight }, 1500); 57 }) 58 59 .fail(function(){ 60 alert('投稿に失敗しました'); 61 }) 62 63 .always(function () { 64 $('#new_item_btn').prop("disabled", false); 65 $('#new_item')[0].reset(); 66 }) 67 return false; 68 }) 69 70 // 削除時の非同期処理 71 $(document).on('click', '.delete_item', function(e){ 72 e.preventDefault(); 73 let url = $(this).attr('href'); 74 let delete_id = $(this)[0].dataset['delete']; 75 76 $.ajax({ 77 url: url, 78 type: 'DELETE', 79 headers: { 80 'Content-Type': 'application/json', 81 }, 82 data: JSON.stringify({delete_id: delete_id}), 83 dataType: 'json', 84 processData: false, 85 contentType: false 86 }) 87 88 .done(function(){ 89 $("li[data-delete-li=" + delete_id + "]").remove(); 90 }) 91 92 .fail(function(){ 93 alert('削除にに失敗しました'); 94 }) 95 return false; 96 }); 97});
- Ruby on Railsでのコントローラ(アクションはajax部分のみに絞ってあります)
ruby
1class ItemsController < ApplicationController 2 before_action :set_item, only: [:edit, :update, :destroy] 3 4 def create 5 @item = Item.new(item_params) 6 if @item.save 7 respond_to do |format| 8 format.json 9 end 10 else 11 redirect_to root_path 12 end 13 end 14 15 def destroy 16 if @item.destroy 17 respond_to do |format| 18 format.json 19 end 20 else 21 redirect_to root_path 22 end 23 24 end 25 26private 27 28 def item_params 29 params.require(:item).permit(:title, :link, :color, :plan, :price, :private, 30 payment_attributes:[:id, :period_long, :period_unit, :first_payment, :pay_method, :description]).merge(user_id: current_user.id) 31 end 32 33 def set_item 34 @item = Item.find(params[:id]) 35 end 36end
- 作成時に返すJsonファイル(jbuilderを使っています)
ruby
1json.id @item.id 2json.uid current_user.id 3json.title @item.title 4json.link @item.link 5json.color @item.color 6json.plan @item.plan 7json.price @item.price 8json.private @item.private 9json.period_long @item.payment.period_long 10json.period_unit @item.payment.period_unit 11json.first_payment @item.payment.first_payment 12json.description @item.payment.description
- 削除時に返すJsonファイル
json
1{"status":"ok"}
エラーメッセージ
仮説
1.今はajaxが別れているがdeferredを用いて作成後の後に働くajaxとしても削除のajax処理を書かないといけないのではないか?
2.ajaxが2重送信として受け取られているためにRails側の自動推測でhtmlレスポンスに切り替わってしまっているのではないか?
環境
Mac OS 10.15
Ruby 2.5.1
Rails 5.2.4.1
Docker 19.03.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/11 08:17
2020/01/11 08:28
2020/01/11 08:38