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

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

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

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

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

8557閲覧

モーダル画面でエラー Uncaught TypeError: $(...).modal is not a function が出てしまう

mikannOishiii

総合スコア6

Ruby on Rails 6

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

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/04/02 11:25

前提・実現したいこと

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'

どなたかお知恵のある方ご助言いただけると嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

jQueryの設定やその他のコードが問題ないとするとjQueryの書き方の問題かと思います。

$("#recordModal").modal("show");$("#recordModal").show();

$("#recordModal").modal("hide");$("#recordModal").hide();

※セレクタ(#recordModal)は修正が必要かもしれません。


show: http://semooh.jp/jquery/api/effects/show/_/

hide: http://semooh.jp/jquery/api/effects/hide/_/

投稿2020/04/02 23:18

no1knows

総合スコア3365

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

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

mikannOishiii

2020/04/03 07:11

コメントありがとうございます! jQuery の書き方を修正したら、エラーを消すことができました。 ただ、エラーは消えたもののモーダルが閉じたあとも背景がモーダル画面の背景のままの状態になり、どこのボタンも押すことができなくなってしまいました。 それについては、下記のように jQuery を追加することで対応できました。 ``` <%# app/views/records/create.js.erb %> <%# app/views/records/update.js.erb %> $("#recordModal").hide(); $("body").removeClass("modal-open"); $(".modal-backdrop").remove(); ``` また、エラーが正しく表示されなかったのは別問題(コントローラーで正しく値を渡せていなかったから)でした。下記のように修正することで無事実装できました。 ``` def update @user = current_user @record = @user.records.find_by(date: params[:record][:date]) respond_to do |format| if @record.update_attributes(record_params) format.html { redirect_to root_url, notice: "Record was successfully updated" } format.json { render :show, status: :created, location: @record } else format.js { render :new } format.json { render json: @record.errors, status: :unprocessable_entity } end end end ```
no1knows

2020/04/03 07:16

それは良かったです! 複数のエラーがあると切り分けが難しいですよね・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問