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 %>

кампании.кофе:

$ ->
  $("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

Я что-то упустил? Спасибо за помощь.


person trurohit    schedule 17.05.2018    source источник
comment
Вы уверены, что jQuery загружается перед вашим скриптом? Что, если вы напишете jQuery вместо $?   -  person    schedule 17.05.2018
comment
Возможно, вам придется сначала добавить $(document).on "turbolinks:load", ->.   -  person Pat Mellon    schedule 17.05.2018
comment
@LyoshaKorogoda Я попытался добавить jQuery вместо $ - он показывает ту же ошибку - Uncaught ReferenceError: jQuery не определен   -  person trurohit    schedule 17.05.2018
comment
@PatMellon не уверен, правильно ли я поступаю. Это синтаксис, который вы предлагаете? $(document).on turbolinks:load, -> $(tr[data-link]).click -> window.location.replace($(this).data(link)); Хотя все равно показывает ту же ошибку   -  person trurohit    schedule 17.05.2018
comment
Что-то вроде $(document).on "turbolinks:load", -> $("tr[data-link]").click -> window.location.replace($(this).data("link")); return return return   -  person Pat Mellon    schedule 17.05.2018
comment
@trurohit, тогда вы можете проверить на вкладке сети, правильно ли загружен скрипт jQuery. Тот факт, что вы ссылаетесь на него в HTML, не означает, что вы действительно получаете его с сервера.   -  person    schedule 17.05.2018
comment
@LyoshaKorogoda не уверен, что проблема в этом. Когда я делаю $(document) в консоли Chrome. Он возвращает объект документа. Таким образом, скрипт jQuery, похоже, загружается нормально.   -  person trurohit    schedule 17.05.2018
comment
@PatMellon пробовал то же самое. Все еще вижу эту ошибку. Наверное, упустил какую-то маленькую деталь.   -  person trurohit    schedule 17.05.2018
comment
@trurohit - тогда вы можете еще раз проверить, загружены ли ваши скрипты в правильном порядке - т.е. jQuery уже загружен, когда ваш скрипт выполняется. Вы можете поставить точку останова в своем коде, а затем проверить вкладку сети, чтобы увидеть, получили ли вы уже jQuery к тому времени, когда вы там.   -  person    schedule 17.05.2018


Ответы (2)


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

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

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

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

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

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

person karl li    schedule 27.12.2018
comment
Карл Ли, вы правы, вам не нужно jquery-ujs, если вы используете Rails 5.1 или выше, потому что для этих версий правильной библиотекой является rails-ujs, но вам все равно нужно jquery-rails, если вы хотите использовать jquery в своем приложении. jquery-ujs и jquery-rails предназначены для другой цели. - person Franchy; 15.04.2020

После установки 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, он снова начнет нормально работать.

person fool-dev    schedule 17.05.2018
comment
Кажется, я понял, в чем может быть проблема. В моем application.js всякий раз, когда я добавляю требование jQuery, оно ломает все мое приложение и перенаправляет все страницы на localhost: 3000/undefined //= require rails-ujs //= require jquery //= require activestorage //= require turbolinks //= require_tree .. Если я удалю «требовать jQuery», оно снова начнет работать нормально. - person trurohit; 18.05.2018
comment
Я не знаю, что происходит, но правильный порядок начинается с require jquery, и если вы используете require jquery_ujs, то не нужно использовать require rails-ujs - person fool-dev; 18.05.2018