質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4486閲覧

Uncaught TypeErrorで非同期通信ができません。

tomoZQ

総合スコア14

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/16 09:23

編集2020/07/16 16:34

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/16 09:35

内容これではタグ足りないのでは。 Ruby前提ならその関係のタグも必要ですし、あとHTMLは必要ですね。
tomoZQ

2020/07/16 09:41

ありがとうございます。タグ増やします。
tomoZQ

2020/07/16 16:35

申し訳ありません、「HTMLは必要」の意味を履き違えてました、ソースコード追加致しましたのでよろしくお願い致します。
guest

回答1

0

自己解決

hamlの構造を

haml

1.chat-main 2 .chat-main__message-form 3 = form_with model: [@group, @message], html: {class: "chat-main__message-form__Form"}, local: true do |f| 4 .chat-main__message-form__Form__contents 5 = f.text_field :content, class: 'chat-main__message-form__Form__contents__message', placeholder: 'type a message' 6 .chat-main__message-form__Form__contents__imgbox 7 = f.label :image, class: 'chat-main__message-form__Form__contents__imgbox__label' do 8 = icon('far', 'image', class: 'chat-main__message-form__Form__contents__imgbox__label__icon') 9 = f.file_field :image, class: 'chat-main__message-form__Form__contents__imgbox__label__file-field' 10 = f.submit 'Send', class: 'chat-main__message-form__Form__btn-send'

と変更することで解消。

投稿2020/07/17 06:51

tomoZQ

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問