JQuery-turbolinks - link_to confirm: появляется несколько раз в Rails
У меня есть типичное приложение для работы с CRUD с
приложения/просмотров/рецепт/show.html.haml
содержащий строку
= link_to "Delete", recipe_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"
Если я создаю новый рецепт в приложениях /views/recipe/new.html.haml и перенаправляюсь на
apps/views/recipe/show.html.haml и нажмите Удалить, затем он дает мне подтверждение один раз и удаляет рецепт.
Однако, если я перехожу на ту же страницу показа из типичного типа index.html.haml, который ссылается на отдельный рецепт, например http://localhost:3000/recipes/29 и нажмите кнопку "Удалить", подтверждение появится 3-4 раза. (ЕСЛИ Я НЕ ОТКАЗАЛ эту страницу, затем она появится только один раз).
Я попробовал добавить jQuery-turbolinks, и он все еще не работал...
app/views/layouts/application.html.haml имеет следующее под заголовком%
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true
= csrf_meta_tags
Не уверен, как его исправить, чтобы он не появлялся несколько раз
EDIT:. Такое же поведение даже после того, как я исправил код, передав @recipe
= link_to "Delete", recipe_path(@recipe), method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"
ИЗМЕНИТЬ 2:
Если я удаляю турбовинты все вместе, это работает buttTurbolinks делает следующие ссылки в вашем веб-приложении быстрее, и, как я понимаю, они используются в большинстве проектов Rails. Так пытаясь увидеть, есть ли работа вокруг? Кажется, это довольно типичная вещь, которую можно сделать.
ИЗМЕНИТЬ 3:
Я добавил jQuery-turbolinks
Gemfile
gem 'jquery-turbolinks'
Файл манифеста JavaScript в следующем порядке:
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
Подтверждение повторяется несколько раз. Должен быть способ исправить это?
РЕДАКТИРОВАТЬ 4:
Я нашел проблему. % Head в HTML был прав под% html и не был правильно отступом, поэтому application.js и другие были включены в тело, а не в раздел head, поэтому вместо
!!! 5
%html
%head
%title Recipe App
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true
= csrf_meta_tags
Это должно быть
!!! 5
%html
%head
%title Recipe App
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true
= csrf_meta_tags
Ответы
Ответ 1
jquery-turbolinks не должно быть действительно необходимым; мои приложения работают без него...
Вы уверены, что:
- У вас есть строка
javascript_include_tag ...
в части <head>
вашего html?
- У вас есть только одна строка
javascript_include_tag ...
?
фон
Проблема заключается в том, что на каждой загрузке страницы turbolinks вызывается настройка jquery_ujs, в результате которой устанавливаются дублированные обработчики.
Поскольку загрузка страницы turbolinks просто заменяет часть документа <body>
, вы должны что-то делать внутри своего <body>
, которое запускает настройку jquery_ujs...
См. также эти ответы: fooobar.com/questions/109590/... и fooobar.com/questions/109590/...
Ответ 2
Возможно, вы включаете несколько копий rails.js?
Оформить заказ и посмотреть, решает ли ваша проблема.
Ответ 3
Вам следует передать id
из recipe
в качестве параметра в recipe_path
, возможно, следующим образом:
= link_to "Delete", recipe_path(recipe), method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"
Без передачи объекта, я предполагаю, что он удаляет много записей.
Ответ 4
i столкнулся с подобной проблемой и решил после выявления ошибок: -
- У меня был
layout
с application.js
включенным
- my
partial
снова включал jquery.min
, который уже был включен в application.js
already included
- В нескольких файлах js я использовал
getScript()
несколько раз, который должен быть только один раз на событие.
Надеюсь, что это поможет.