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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

99閲覧

jquery-validation-pluginを用いたエラーメッセージの表示ができません。

kishikishi

総合スコア0

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

2クリップ

投稿2025/01/20 15:31

実現したいこと

jquery-validation-pluginを使用したバリデーションのエラーメッセージを表示させたいと考えています。
具体的にはapp/javascript/packs/validation.jsのファイルに記述したエラーメッセージがバリデーションに引っかかった際に表示できるようにしたいです。
初心者で説明が分かりづらい点も多々あるかと思いますが、ご協力よろしくお願いいたします。

発生している問題・分からないこと

実際にアプリケーションの登録画面で何も入力せずに登録を行うと、エラーメッセージが表示されませんでした。
ブラウザのコンソールツールで確認した所、下記エラーメッセージが表示されていました。

エラーメッセージ

error

1Uncaught TypeError: form.validate is not a function 2 at HTMLDocument.<anonymous> (validation.js:9:1) 3 at HTMLDocument.dispatch (event.js:290:1) 4 at elemData.handle (event.js:115:1) 5 at ./node_modules/turbolinks/dist/turbolinks.js.e.dispatch (turbolinks.js:68:1) 6 at r.notifyApplicationAfterPageLoad (turbolinks.js:885:1) 7 at r.pageLoaded (turbolinks.js:839:1) 8 at turbolinks.js:765:1

該当のソースコード

app/javascript/packs/validation.js

1// validation.js 2console.log("validation.js loaded"); 3 4$(document).on("turbolinks:load", function () { 5 console.log("Turbolinks loaded"); 6 7 const form = $("#sign-up-id"); 8 if (form.length > 0) { 9 form.validate({ 10 rules: { 11 "user[name]": { 12 required: true, 13 minlength: 2, 14 maxlength: 20, 15 }, 16 "user[email]": { 17 required: true, 18 email: true, 19 }, 20 "user[password]": { 21 required: true, 22 minlength: 6, 23 }, 24 "user[password-confirmation]": { 25 required: true, 26 equalTo: "#user_password", 27 }, 28 }, 29 messages: { 30 "user[name]": { 31 required: "ニックネームを入力して下さい", 32 minlength: "ニックネームは2文字以上で入力して下さい", 33 maxlength: "ニックネームは20文字以内で入力して下さい", 34 }, 35 "user[email]": { 36 required: "メールアドレスを入力して下さい", 37 email: "正しいメールアドレスを入力して下さい", 38 }, 39 "user[password]": { 40 required: "パスワードを入力して下さい", 41 minlength: "パスワードは6文字以上で入力して下さい", 42 }, 43 "user[password-confirmation]": { 44 required: "パスワード確認を入力して下さい", 45 equalTo: "パスワードが一致しません", 46 }, 47 }, 48 errorElement: "div", 49 errorClass: "invalid-feedback", 50 highlight: function (element) { 51 $(element).addClass("is-invalid"); 52 }, 53 unhighlight: function (element) { 54 $(element).removeClass("is-invalid"); 55 }, 56 errorPlacement: function (error, element) { 57 element.closest(".form-group").append(error); 58 }, 59 onkeyup: function (element) { 60 $(element).valid(); 61 }, 62 onblur: function (element) { 63 $(element).valid(); 64 }, 65 }); 66 } 67});

app/javascript/packs/application.js

1// application.js 2window.$ = window.jQuery = require('jquery'); 3import "jquery"; 4import "jquery-validation"; 5import "../packs/validation"; 6import "popper.js"; 7import "bootstrap"; 8import "../stylesheets/application"; 9 10import Rails from "@rails/ujs"; 11import Turbolinks from "turbolinks"; 12import * as ActiveStorage from "@rails/activestorage"; 13import "channels"; 14 15import Raty from "raty.js"; 16window.raty = function (elem, opt) { 17 let raty = new Raty(elem, opt); 18 raty.init(); 19 return raty; 20}; 21 22Rails.start(); 23Turbolinks.start(); 24ActiveStorage.start(); 25

app/views/devise/registration/new.html.erb

1<%= form_with model: @user, id: "sign-up-id", url: user_registration_path do |f| %> 2 <div class="form-group mb-2"> 3 <label class= "control-label ml-5"> 4 <%= f.label :name %><br /> 5 </label> 6 <%= f.text_field :name, autofocus: true, autocomplete: "name", class: "form-control w-75 mx-auto #{'is-invalid' if @user.errors[:name].present?}" %> 7 <div class= "invalid-feedback mx-auto w-75"> 8 </div> 9 </div> 10 11 <div class="form-group mb-2"> 12 <label class= "control-label ml-5"> 13 <%= f.label :email %><br /> 14 </label> 15 <%= f.email_field :email, autocomplete: "email", class: "form-control w-75 mx-auto #{'is-invalid' if @user.errors[:email].present?}" %> 16 <div class= "invalid-feedback mx-auto w-75"> 17 </div> 18 </div> 19 20 <div class="form-group mb-2"> 21 <label class= "control-label ml-5"> 22 <%= f.label :password %> 23 </label> 24 <% if @minimum_password_length %> 25 <em>(<%= @minimum_password_length %> 文字以上)</em> 26 <% end %><br /> 27 <%= f.password_field :password, id: "user_password", autocomplete: "new-password", class: "form-control w-75 mx-auto #{'is-invalid' if @user.errors[:password].present?}" %> 28 <div class= "invalid-feedback mx-auto w-75"> 29 </div> 30 </div> 31 32 <div class="form-group mb-2"> 33 <label class= "control-label ml-5"> 34 <%= f.label :password_confirmation %><br /> 35 </label> 36 <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "form-control w-75 mx-auto #{'is-invalid' if @user.errors[:password_confirmation].present?}" %> 37 <div class= "invalid-feedback mx-auto w-75"> 38 </div> 39 </div> 40 41 <div class="form-group mb-2"> 42 <%= f.submit "新規登録", class: "btn btn-primary ml-5" %> 43 </div> 44 <% end %>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

・webpackのキャッシュの削除、再度ビルドの実施→ エラーは解消しませんでした。
・console.log(typeof $.fn.validate);をコンソールツール上で入力 → functionと返されました。

補足

・javascriptの読み込みは、app/views/layouts/application.html.erbで行っています。

該当箇所
<script src="https://kit.fontawesome.com/7b0c0b1a1d.js" crossorigin="anonymous"></script>
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

・jquery、jquery-validation-plugin等のバージョンが記載されているpackage.jsonを下記に記載します。

{
"name": "nekonigohan",
"private": true,
"dependencies": {
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@rails/actioncable": "^6.0.0",
"@rails/activestorage": "^6.0.0",
"@rails/ujs": "^6.0.0",
"@rails/webpacker": "5.4.4",
"bootstrap": "^4.6.2",
"jquery": "^3.7.1",
"jquery-validation": "^1.21.0",
"popper.js": "^1.16.1",
"turbolinks": "^5.2.0",
"webpack": "^4.46.0",
"webpack-cli": "^3.3.12"
},
"version": "0.1.0",
"devDependencies": {
"webpack-dev-server": "^3"
}
}

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

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

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

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

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

Lhankor_Mhy

2025/01/21 02:07 編集

jQuery を2回読み込んでいるように見えるのが気になっています。これは必要なのでしょうか? 必要であるならば、どの識別子がどのjQueryになっているか、どのスコープで有効になっているかを確認されてみてはどうでしょうか。
kishikishi

2025/01/21 02:27

ご指摘ありがとうございます。 おっしゃる通り、app/javascript/packs/application.jsの2,3行目において、jqueryを2重に読み込むような記述を行っていました。 jqueryを2回読み込む必要はないので、コードを下記のように修正しました。 import $ from "jquery"; window.$ = window.jQuery = $; 修正後、アプリケーションを起動してエラーが解消されたかを確認しましたが、解消されていませんでした。
Lhankor_Mhy

2025/01/21 03:42

そうなんですね。では、webpack が関わる問題でしょうか? お役に立てずすみません。
kishikishi

2025/01/21 04:24

webpackに関して、キャッシュのクリア、記述の確認等を行ったのですが上手くいきませんでした。 もう少し自分で調べて、解決策を模索したいと思います。 コメント、ご指摘頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問