Uncaught ReferenceError: $ не определен в Rails 5.2

Я создаю приложение rails, в котором я хочу перенаправить пользователя к действию #show, когда он щелкает строку индексной таблицы.

Для этого я пытаюсь использовать JQuery в своем файле coffeescript. Вот соответствующий код

index.html.erb:

<% @campaign.each do |campaign| %>
    <tr data-link = "<%= campaign_path(campaign) %>">
        <td><%= campaign.campaign_name %></td>
        <td><%= campaign.start_date %></td>
        <td><%= campaign.created_at %></td>
        <td><%= link_to "delete", campaign, class:"btn btn-default btn-xs", method: :delete, data: { confirm: "You sure?" } %></td>
     </tr>
<% end %>

campaign.coffee:

$ ->
  $("tr[data-link]").click ->
    window.location.replace($(this).data("link"));

Но как только я запустил это, я продолжаю видеть эту ошибку в консоли браузера:

Uncaught ReferenceError: $ is not defined

Я установил гем jquery-rails. Включил его и в свой файл application.js. Когда мое приложение отображается, я также вижу тег сценария JQuery в заголовке.

<script src = "/assets/jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1"></script>

Но все равно вижу эту ошибку в консоли

Uncaught ReferenceError: $ is not defined
at campaigns.self-4617c47e06384e281aa2550caae08f3b4986441d2bfff9b6e3519f0a1e82f3d7.js?body=1:2
at campaigns.self-4617c47e06384e281aa2550caae08f3b4986441d2bfff9b6e3519f0a1e82f3d7.js?body=1:8
(anonymous) @ campaigns.self-4617c47e06384e281aa2550caae08f3b4986441d2bfff9b6e3519f0a1e82f3d7.js?body=1:2
(anonymous) @ campaigns.self-4617c47e06384e281aa2550caae08f3b4986441d2bfff9b6e3519f0a1e82f3d7.js?body=1:8

Я что-нибудь упускаю? Спасибо за помощь.

Вы уверены, что jQuery загружается до вашего скрипта? Что, если вы напишете jQuery вместо $?

user9539019 17.05.2018 15:32

Возможно, вам сначала потребуется добавить $(document).on "turbolinks:load", ->.

Pat Mellon 17.05.2018 15:36

@LyoshaKorogoda Я попытался добавить jQuery вместо $ - он показывает ту же ошибку - Uncaught ReferenceError: jQuery не определен

trurohit 17.05.2018 15:51

@PatMellon не уверен, правильно ли я делаю. Это синтаксис, который вы предлагаете? $ (документ) .on "turbolinks: load", -> $ ("tr [data-link]"). click -> window.location.replace ($ (this) .data ("link")); Хотя он все еще показывает ту же ошибку

trurohit 17.05.2018 15:54

Что-то вроде $(document).on "turbolinks:load", ->$("tr[data-link]").click ->window.location.replace($(this).data("link"));returnreturnreturn

Pat Mellon 17.05.2018 16:00

@trurohit, тогда вы можете проверить на вкладке сети, правильно ли загружен скрипт jQuery. Тот факт, что вы ссылаетесь на него в HTML, не означает, что вы действительно получаете его от сервера.

user9539019 17.05.2018 16:17

@LyoshaKorogoda не уверен, что это проблема. Когда я делаю $ (document) в консоли Chrome. Он возвращает объект документа. Итак, скрипт jQuery, похоже, загружается нормально.

trurohit 17.05.2018 16:26

@PatMellon пробовал то же самое. Все еще вижу эту ошибку. Вероятно, упущена небольшая деталь.

trurohit 17.05.2018 16:27

@trurohit - тогда вы можете еще раз проверить, загружены ли ваши скрипты в правильном порядке - т.е. jQuery уже загружен, когда ваш скрипт выполняется. Вы можете поместить точку останова в свой код, а затем проверить вкладку сети, чтобы увидеть, получили ли вы уже jQuery к тому времени, когда вы там.

user9539019 17.05.2018 16:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
9
4 922
2

Ответы 2

После установки jquery-rails следуйте порядку application.js

//= require jquery
//= require jquery_ujs 
.....

См. Installation

Решение из комментария

Я понял, в чем может быть проблема. В моем application.js всякий раз, когда я добавляю require jquery, все мое приложение ломается и все страницы перенаправляются на localhost:3000/undefined.

//= require rails-ujs 
//= require jquery 
//= require activestorage 
//= require turbolinks 
//= require_tree . 

Если я удалю require jquery, он снова начнет работать нормально.

Думаю, я понял, в чем может быть проблема. В моем application.js всякий раз, когда я добавляю require jQuery - он ломает все мое приложение и перенаправляет все страницы на localhost: 3000 / undefined //= require rails-ujs //= require jquery //= require activestorage //= require turbolinks //= require_tree .. Если я удалю «require jQuery», он снова начнет работать нормально.

trurohit 18.05.2018 04:42

Я не знаю, что происходит, но правильный порядок - начать с require jquery, и если вы используете require jquery_ujs, тогда нет необходимости использовать require rails-ujs

fool-dev 18.05.2018 07:36

Я думаю, что столкнулся с той же проблемой, и я понял, что, должно быть, неправильно понял официальное руководство:

что я думал в Rails 5.2 (после Rails 5.1), поскольку у нас есть встроенный rails-ujs, нам больше не нужен jquery / jquery_ujs.

Но я был неправ.

Я узнал свою ошибку через этот статья. После того, как я обнаружил проблему «Uncaught ReferenceError: $ не определен», все, что я сомневался, было «jquery не установлен». И после того, как проверил много сообщений, я попытался установить jquery-rails для тестирования.

Наконец-то это работает.

Да, нам нужны jquery-rails даже в Rails 5.2.

karl li, вы правы, вам не нужен jquery-ujs, если вы используете Rails 5.1 или выше, потому что для этих версий правильной библиотекой является rails-ujs, но вам все равно понадобится jquery-rails, если вы хотите использовать jquery в своем приложении. jquery-ujs и jquery-rails предназначены для разных целей.

Franchy 15.04.2020 15:37

Другие вопросы по теме