Что это делает: `const { $ } = require («@rails / ujs»);` в моем приложении Rails? Похоже, это вызывает ошибку

#ruby-on-rails #rails-ujs

#ruby-on-rails #rails-ujs

Вопрос:

в app/javascript/packs/application.js я вижу: const { $ } = require("@rails/ujs");

По какой-то неизвестной причине я получаю эту ошибку:

 rails-ujs.js:73 Uncaught DOMException: Failed to execute 'querySelectorAll' on 'Document': '[object HTMLDocument]' is not a valid selector.
    at ./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js.Rails.$ (http://192.168.1.34:3000/packs/js/application-82ae508a0043ae1b2583.js:1497:52)
    at Object../app/javascript/packs/application.js (http://192.168.1.34:3000/packs/js/application-82ae508a0043ae1b2583.js:207:1)
    at __webpack_require__ (http://192.168.1.34:3000/packs/js/application-82ae508a0043ae1b2583.js:20:30)
    at http://192.168.1.34:3000/packs/js/application-82ae508a0043ae1b2583.js:84:18
    at http://192.168.1.34:3000/packs/js/application-82ae508a0043ae1b2583.js:87:10
 

Когда я комментирую строку: const { $ } = require("@rails/ujs"); — тогда ошибка исчезает, но я не знаю, нужна ли мне эта строка или нет?

Раньше этой ошибки не было … хотелось бы, чтобы у меня было больше деталей, но у меня их нет.

Комментарии:

1. Обработчик Rails UJS предоставляет функциональные возможности для ссылок с data-method опцией, подтверждениями и ajax с remote: true формами и ссылками. require это директива для webpacker, которая импортирует зависимость в ваш пакет. guides.rubyonrails.org/working_with_javascript_in_rails.html

2. Вы пытались посмотреть на github, чтобы узнать, связано ли это с проблемой с вашей версией Rails? Наиболее вероятной причиной здесь является то, что здесь есть некоторый код, который ожидает $ , что это будет jQuery, и вместо этого он использует собственный querySelectorAll , который не принимает объект, подобный jquery.

3. @max хорошо, я думаю, это может быть потому application.js , что я добавляю свою логику приложения, похоже, я должен поместить свою логику приложения в пакеты, а затем импортировать ее application.js , верно? Я думаю, именно поэтому я получаю ошибку. Я пишу код, который использует $ символ, как если бы это был jQuery, и я вкладываю в него эту логику app/javascript/packs/application.js , просто делая это для удобства, но, возможно, я не должен этого делать?

4. Ну, для начала не используйте Rails UJS, как если бы это был jquery. Последняя версия не зависит от jquery. Я не думаю, что вам действительно нужно назначать модуль константе $ здесь. Не уверен, почему это сделано в первую очередь.

5. Если вы хотите использовать jQuery и избежать конфликтов, просто используйте IIFE . (function($){ // code goes here }(jQuery)); .