前提・実現したいこと
railsでグループが作成でき、その中で以下2つのことができるアプリを開発しています。
①グループメンバー同士のチャット
②グループごとに場所(store)を登録でき、そのstoreについてメンバーがコメントをすることができる。
発生している問題・エラーメッセージ
グループ内のチャットにはmessageというテーブルを作成し、投稿されたデータを非同期通信で実装したところ下記エラーが表示されてしましました。
Uncaught TypeError: Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'. at HTMLDivElement.<anonymous> (message.self-a4cf30b48cb2db425cbccb8b1375c02bc6d692ea7a6450f6f8d193dde52efd9a.js?body=1:56) at HTMLDivElement.dispatch (jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:5227) at HTMLDivElement.elemData.handle (jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:4879) (anonymous) @ message.self-a4cf30b48cb2db425cbccb8b1375c02bc6d692ea7a6450f6f8d193dde52efd9a.js?body=1:56 dispatch @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:5227 elemData.handle @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:4879
該当のソースコード
javascript
1#message.js 2 3$(function(){ 4 5 function buildHTML(message){ 6 if ( message.image ) { 7 let html = 8 `<div class="show-lists__chat-main__message-lists__contents"> 9 <div class="show-lists__chat-main__message-lists__contents__content"> 10 11 <div class="show-lists__chat-main__message-lists__contents__content__left"> 12 <div class="show-lists__chat-main__message-lists__contents__content__left__name"> 13 ${message.user_name} 14 </div> 15 <div class="show-lists__chat-main__message-lists__contents__content__left__text"> 16 ${message.content} 17 <img class=".show-lists__chat-main__message-lists__contents__content__left__text__img" src="${message.image}"> 18 </div> 19 </div> 20 21 <div class="show-lists__chat-main__message-lists__contents__content__right"> 22 <div class="show-lists__chat-main__message-lists__contents__content__right__time-stamp"> 23 ${message.created_at} 24 </div> 25 </div> 26 27 </div> 28 </div>` 29 return html; 30 } else { 31 let html = 32 `<div class="show-lists__chat-main__message-lists__contents"> 33 <div class="show-lists__chat-main__message-lists__contents__content"> 34 35 <div class="show-lists__chat-main__message-lists__contents__content__left"> 36 <div class="show-lists__chat-main__message-lists__contents__content__left__name"> 37 ${message.user_name} 38 </div> 39 <div class="show-lists__chat-main__message-lists__contents__content__left__text"> 40 ${message.content} 41 </div> 42 </div> 43 44 <div class="show-lists__chat-main__message-lists__contents__content__right"> 45 <div class="show-lists__chat-main__message-lists__contents__content__right__time-stamp"> 46 ${message.created_at} 47 </div> 48 </div> 49 50 </div> 51 </div>` 52 return html; 53 }; 54 } 55 56 $('.show-lists__chat-main__message-form').on('submit', function(e){ 57 e.preventDefault(); 58 let formData = new FormData(this); 59 let url = $(this).attr('action'); 60 61 $.ajax({ 62 url: url, 63 type: "POST", 64 data: formData, 65 dataType: 'json', 66 processData: false, 67 contentType: false 68 }) 69 70 .done(function(data){ 71 let html = buildHTML(data); 72 $('.show-lists__chat-main__message-lists').append(html); 73 $('form')[0].reset(); 74 $('.show-lists__chat-main__message-lists').animate({ scrollTop: $('.show-lists__chat-main__message-lists')[0].scrollHeight}); 75 $('.chat-main__message-form__Form__btn-send').prop('disabled', false); 76 }) 77 .fail(function() { 78 alert("メッセージ送信に失敗しました"); 79 $('.chat-main__message-form__Form__btn-send').prop('disabled', false); 80 }); 81 }); 82});
haml
1.show-lists__chat-main__message-form 2 = form_with model: [@group, @message], html: {class: ".show-lists__chat-main__message-form"}, local: true do |f| 3 .show-lists__chat-main__message-form__contents 4 .show-lists__chat-main__message-form__contents__input-space 5 = f.text_field :content, class: '.show-lists__chat-main__message-form__contents__input-space', placeholder: 'type a message' 6 .show-lists__chat-main__message-form__contents__input-space__label 7 = f.label :image, class: '.show-lists__chat-main__message-form__contents__input-space__label' do 8 =icon('far', 'image') 9 .show-lists__chat-main__message-form__contents__input-space__label__hidden 10 = f.file_field :image, class: '.show-lists__chat-main__message-form__contents__input-space__label__hidden' 11 .show-lists__chat-main__message-form__contents__btn-box 12 = f.submit 'Send', class: '.show-lists__chat-main__message-form__contents__input-space__btn-box__Send' 13
ruby
1class MessagesController < ApplicationController 2 before_action :set_group 3 4 def index 5 @message = Message.new 6 @messages = @group.messages.includes(:user).order("created_at DESC") 7 end 8 9 def create 10 @message = @group.messages.new(message_params) 11 if @message.save 12 respond_to do |format| 13 format.json 14 end 15 else 16 @messages = @group.messages.includes(:user) 17 flash.now[:alert] = 'メッセージを入力してください。' 18 render :index 19 end 20 end 21 22 23 private 24 25 def message_params 26 params.require(:message).permit(:content, :image).merge(user_id: current_user.id) 27 end 28 29 def set_group 30 @group = Group.find(params[:group_id]) 31 end 32end 33
試したこと
ターミナルで確認したところメッセージがas htmlになっていました。$ajaxの中でjsonを指定しているのにも関わらずこうなってしまっているところにも原因があるのでしょうか?
当方初学者のため、google等で検索しましたが、中々回答にたどり着けなく、質問させていただきます。
補足情報(FW/ツールのバージョンなど)
MySQL 5.6.47
sequel Pro
Rails 6.0.3.2
回答1件
あなたの回答
tips
プレビュー