前提・実現したいこと
Rails6でAjaxを用いたTODOアプリを作成しています。
Modalウィンドウ内のフォームでメッセージをAjaxで投稿投稿後、Modalウィンドウを閉じる
という動作を実現したいのですが、上手くいきません。
すでに開かれているモーダルの要素を取得し、それを「閉じる」という動作を実行したいです。
環境
- Rails 6.0.3
- Bootstrap 5.0.0-beta3
該当のソースコード
erb
1<!-- app/views/messages/index.html.erb --> 2 3<!-- モーダルのトリガーボタン --> 4<%= link_to 'NEW TASK CREATE', 5 new_message_path, 6 data: { remote: true }, 7 class: "btn btn-primary", 8 id: :modalButton %> 9 10<!-- モーダルをレンダリング --> 11<%= render 'modal' %> 12 13<div id="messages"> 14 <%= render @messages %> 15</div>
erb
1<!-- app/views/messages/_modal.html.erb --> 2 3<!-- Modal --> 4<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 5 <div class="modal-dialog"> 6 <div class="modal-content"> 7 <div class="modal-header"> 8 <h5 class="modal-title" id="exampleModalLabel">Modal title</h5> 9 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 10 </div> 11 <div class="modal-body"> 12 <!-- フォームをレンダリング --> 13 <%= render 'form', message: Message.new, value: '投稿' %> 14 </div> 15 </div> 16 </div> 17</div>
erb
1<!-- app/views/messages/_form.html.erb --> 2 3<%= form_with model: message, local: false do |f| %> 4 <%= f.text_field :content, autocomplete: 'off' %> 5 6 <div class="modal-footer"> 7 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> 8 <%= f.submit value, class: "btn btn-primary", id: "submitButton" %> 9 </div> 10 <% if value == '更新' %> 11 <%= link_to '取消', new_message_path, data: { remote: true } %> 12 <% end %> 13<% end %>
js
1// app/views/messages/new.js.erb 2// indexの「NEW TASK CREATE」をクリックしたらこちらの処理が流れてモーダルが開く 3 4// モーダル内のフォームを取得 5var form = document.getElementsByTagName('form')[0] 6// フォームのレンダリング 7form.outerHTML = '<%= j(render 'form', message: Message.new, value: '投稿') %>' 8 9// モーダルを開く ================================================================== 10// 「NEW TASK CREATE」ボタンを取得 11var modalButton = document.getElementById('modalButton'); 12 13// モーダルを新規に作成 14var exampleModal = new bootstrap.Modal(document.getElementById('exampleModal'), { 15 keyboard: false 16}) 17 18// モーダルを開く 19modalButton.addEventListener('click', function () { 20 exampleModal.show(); 21 console.log('[new_message_path Modal Open]') 22}) 23// ============================================================================== 24 25
js
1// app/views/messages/create.js.erb 2// フォームの「投稿」ボタンがクリックされたら投稿内容がPOSTされ、こちらの処理が流れる 3 4// メッセージ一覧の一番下に新規メッセージを追加する 5document.getElementById('messages').insertAdjacentHTML('beforeend', '<%= j(render @message) %>') 6// フォームのインプットを空にする 7document.getElementById('message_content').value = '' 8 9console.log('[POST]') 10 11// モーダルを閉じる動作(エラーが出る)============================ 12// モーダルを取得 13var exampleModal = document.getElementById('exampleModal') 14 15// モーダルを閉じる 16exampleModal.hide() 17console.log('hide') 18 19// Uncaught TypeError: exampleModal.hide is not a function 20// at <anonymous>:11:14 21// at processResponse (rails-ujs.js:283) 22// at rails-ujs.js:196 23// at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.js:264) 24 25// ========================================================= 26
試したこと
モーダルウィンドウが表示された時に、HTML、CSSにクラス名が変更されたり要素が増えます。
html
1<body class=vsc-initialized modal-open> 2... 3 <div class="modal fade show" ...> 4 ... 5 </div> 6... 7 <div class="modal-backdrop fade show"> 8</body>
これらの要素を「submitButton」がクリックされた時に
jsで削除したりすることを試しましたが、その後の動作に異常が起きます。
Ajaxを諦めれば全てうまくいくのですが、どうしても実現したいと考えています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/02 12:00
2021/07/02 12:41 編集
2021/07/02 14:38
2021/07/03 09:34