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() несколько раз, который должен быть только один раз на событие.

Надеюсь, что это поможет.