実現したいこと
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"
}
}
あなたの回答
tips
プレビュー