前提・実現したいこと
rails6 にてモーダル画面から記録を登録する画面を作っています。
「記入する」ボタンを押すとモーダル画面が表示され、記録をつけることができ、保存・更新されるとモーダルが閉じる仕様を実現したいです。
しかし、コンソールにて以下のようなエラーが表示され、記録自体はできますがモーダルを閉じることができません。
Uncaught TypeError: $(...).modal is not a function
発生している問題・エラーメッセージ
console
1Uncaught TypeError: $(...).modal is not a function 2 at <anonymous>:2:19 3 at processResponse (rails-ujs.js:283) 4 at rails-ujs.js:196 5 at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.js:264)
起きている問題
- モーダルを開くとエラー文表示される(この時の見た目の不具合はなく、、モーダル自体は普通に表示されます。)
- 記録をつけて保存しようとすると、モーダルが閉じない。(記録はできている)
該当のソースコード
以下、モーダルリンクが設置してある共通画面(抜粋)と、モーダル画面の中身(form)です。どちらもAjaxに対応するために remote: true
を設置しています。
erb
1<nav class="nav-menu d-none d-lg-block"> 2 <ul> 3 <li class="get-recorded"> 4 <%= link_to "記入する", new_record_path, remote: true, id: "record-modal", data: {toggle: "modal", target: "#recordModal"} %> 5 </li> 6 <li><%# メニュー省略 %></li> 7 <li><%# メニュー省略 %></li> 8 </ul> 9</nav><!-- .nav-menu --> 10<%# 中略 %> 11<div class="modal" id="recordModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"></div>
erb
1<!-- Modal --> 2 <div class="modal-dialog" role="document"> 3 <div class="modal-content"> 4 <%= form_for @record, remote: true do |f| %> 5 <% if @record.errors.any? %> 6 <%# エラーある場合ここに表示(省略) %> 7 <% end %> 8 <div class="form-group"> 9 <%= f.label :date, for: "inputDate" %> 10 <%= f.date_field :date, class: "form-control", id: "inputDate", value: @record.date %> 11 </div> 12 <p class="rcd-lbl">朝:</p> 13 <div class="form-row"> 14 <div class="form-group col-md-4"> 15 <%= f.label :m_sbp, for: "inputM_SBP", class: "sr-only" %> 16 <%= f.telephone_field :m_sbp, placeholder: "最高血圧", class: "form-control", id: "inputM_SBP", value: @record.m_sbp %> 17 </div> 18 <%# 以下フォーム省略 %> 19 </div> 20 <div class="form-group"> 21 <%= f.submit "記録する", class: "btn btn-block btn-blue", id: "record-btn" %> 22 </div> 23 <% end %> 24 </div> 25 </div>
以下、コントローラーです。新規も編集も同じモーダル画面から入力できるようになっていて、今日の日付の記録がない場合は新規登録、ある場合はフォームに記録が表示され編集・更新できる仕様になっています。save, update 自体はできていますが、noticeやエラー文は表示されません。
rb
1# app/controllers/records_controller.rb 2 3def new 4 @user = current_user 5 default_day = Time.now 6 if @user.records.exists?(date: default_day) 7 @record = @user.records.find_by(date: default_day) 8 else 9 flash.now[:danger] = 'errored!' 10 @record = Record.new(date: default_day) 11 end 12end 13 14def create 15 @record = Record.new(record_params) 16 respond_to do |format| 17 if @record.save 18 format.html{ redirect_to root_url, notice: 'Record was successfully created.'} 19 format.js 20 else 21 format.html{ render :new, record: @record} 22 format.json{ render json: @record.errors, status: :unprocessable_entity} 23 end 24 end 25end 26 27def update 28 @user = current_user 29 @record = @user.records.find_by(date: params[:record][:date]) 30 respond_to do |format| 31 if @record.update_attributes(record_params) 32 format.html { redirect_to root_url, notice: 'Record was successfully updated.' } 33 format.js 34 else 35 format.html { render :new, record: @record } 36 format.json { render json: @record.errors, status: :unprocessable_entity } 37 format.js 38 end 39 end 40 end
以下、モーダルの開閉画面のjsです。開くけれどエラー文が表示されます。また、閉じるほうは反応しません。(後述にある設定変更をすると閉じるようになります。)
erb
1<%# app/views/records/new.js.erb %> 2 3$("#recordModal").html("<%= escape_javascript(render 'form', record: @record) %>") 4$("#recordModal").modal("show")
erb
1<%# app/views/records/create.js.erb %> 2<%# app/views/records/update.js.erb %> 3 4$("#recordModal").modal("hide");
以下、bootstrap, jquery を使用するために設定している内容です。rails6を利用しているため、webpackerで入れました。
js
1# app/javascript/packs/application.js 2 3require("@rails/ujs").start() 4require("turbolinks").start() 5require("@rails/activestorage").start() 6require("channels") 7require("jquery") 8# このアプリ用に入れたjs 9require("chartkick") 10require("chart.js") 11# import 12import 'bootstrap'; 13import '../stylesheets/application';
js
1# config/webpack/environment.js 2 3const { environment } = require('@rails/webpacker') 4 5const webpack = require('webpack') 6environment.plugins.prepend('Provide', 7 new webpack.ProvidePlugin({ 8 $: 'jquery/src/jquery', 9 jQuery: 'jquery/src/jquery', 10 Popper: ['popper.js', 'default'] 11 }) 12)
試したこと
こちらの記事を参考に、jsの読み込みを設定変更するとエラーは消えます。
(application.js と environment.js の変更)
https://stackoverflow.com/questions/58371711/bootstrap-hide-modal-not-working-in-rails-6-using-ajax
記録が保存・更新されモーダルが閉じるようになりますが、
設定してある notice や エラーの render は無視されてしまいます。
他にも記事を読む限り、javascriptの読み込みが影響しているのではないかと思うのですが、経験値が少なくここまでしか分かりませんでした。
補足情報(FW/ツールのバージョンなど)
ruby '2.6.5'
rails '6.0.2'
どなたかお知恵のある方ご助言いただけると嬉しいです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/03 07:11
2020/04/03 07:16