Dziwne zachowanie .destroy

Witam. Napotkałem bardzo dziwne zachowanie metody destroy (na obiekcie ActiveRecord). Mianowicie wywołuję metodę destroy w NotesController. Wywołuję tę metodę dokładnie tak jak w resources - czyli przykładowy link: /notes/5 z metodą “DELETE”, gdzie 5 to id postu, który istnieje. No i metoda destroy wygląda tak:

def destroy
    @note = Note.find_by_id!(params[:id])
    if @note
        @note.destroy
        flash[:success] = [t('controllers.notes.delete.success')]
    else
        flash[:warning] = [t('controllers.notes.delete.not_found')]
    end
    redirect_to notes_path
end

No i działa to następująco:
Przy pierwszym wywołaniu zwraca błąd:

ActiveRecord::RecordNotFound
  in NotesController#destroy
Couldn't find Note

Ale - o dziwo - rekord się usuwa.
Jeśli natomiast usunę wykrzyknik z find_by_id!, to:

  1. rekord się usuwa
  2. wykonuje się warunek z “else” (wykona flash :warning, i nie wykona się flash :success)
    Jeśli natomiast wyrzucę całkowicie .destroy, to wtedy wykona się flash :success, a rekord sie nie usunie.
    Jakim cudem tak się dzieje? Sprawdzane kilkanaście razy. To działa trochę tak, jakby .destroy w ogóle nie znajdował się w ifie i wykonywał za każdym razem. Naprawdę nie mam pojęcia o co chodzi.

Na razie nie mam pomysłu, może kawałek backtrace’a rozjaśniłby sprawę.
EDIT: Obstawiam, że dwa razy wykonuje się request do destroy. Może przez JS. Sprawdź w logach.

Faktycznie, to by wyjaśniało sprawę całkowicie. Jak wrócę do domu, to zapoznam się z problemem - ale to musi o to chodzić - i spróbuję go jakoś rozwiązać. Na pewno się tu jeszcze odezwę.

Tak jest - wykonuje się podwójne żądanie na DELETE. Poniżej podaję log z serwera przy jednym kliknięciu na link potwierdzający (notes/7/delete to ścieżka do potwierdzenia usunięcia):

Started GET "/notes/7/delete" for 127.0.0.1 at 2015-06-17 23:33:31 +0200
Processing by NotesController#delete as HTML
  Parameters: {"id"=>"7"}
  Note Load (0.4ms)  SELECT  "notes".* FROM "notes" WHERE "notes"."id" = $1 LIMIT 1  [["id", 7]]
  Rendered notes/delete.html.erb within layouts/application (2.1ms)
Completed 200 OK in 61ms (Views: 58.8ms | ActiveRecord: 0.4ms)


Started DELETE "/notes/7" for 127.0.0.1 at 2015-06-17 23:33:38 +0200
Processing by NotesController#destroy as HTML
  Parameters: {"authenticity_token"=>"r2IiDx5t8+nDTLV5cMlv81oQeJYY5NP8C53aozNJ/BuAj2y55XTL+dX+UNvuG1/Cbss6YDukKd5Ls8BDipkw0A==", "id"=>"7"}
  Note Load (0.4ms)  SELECT  "notes".* FROM "notes" WHERE "notes"."id" = $1 LIMIT 1  [["id", 7]]
   (0.2ms)  BEGIN
  SQL (0.3ms)  DELETE FROM "notes" WHERE "notes"."id" = $1  [["id", 7]]
   (79.6ms)  COMMIT
Redirected to http://localhost:3000/notes
Completed 302 Found in 84ms (ActiveRecord: 80.5ms)


Started DELETE "/notes/7" for 127.0.0.1 at 2015-06-17 23:33:38 +0200
Processing by NotesController#destroy as HTML
  Parameters: {"authenticity_token"=>"r2IiDx5t8+nDTLV5cMlv81oQeJYY5NP8C53aozNJ/BuAj2y55XTL+dX+UNvuG1/Cbss6YDukKd5Ls8BDipkw0A==", "id"=>"7"}
  Note Load (0.4ms)  SELECT  "notes".* FROM "notes" WHERE "notes"."id" = $1 LIMIT 1  [["id", 7]]
Completed 404 Not Found in 2ms (ActiveRecord: 0.4ms)

ActiveRecord::RecordNotFound (Couldn't find Note):
  app/controllers/notes_controller.rb:43:in `destroy'

Link do usunięcia tworzę w taki sposób:
<%= link_to t(‘views.notes.delete.approval’), @note, method: :delete, class: ‘approval’ %>
Może tu leży błąd, że się wysyła podwójne żądanie? Żadnego JS od siebie nie dodawałem. Jest tylko jQuery, jQuery_ujs oraz turbolinks

A jak działa to potwierdzanie?

Jest to zwyczajna strona z dwoma linkami. Repozytorium (a konkretnie delete.html.erb) znajduje się tutaj:
https://github.com/soanvig/Code-ordinator/blob/master/app/views/notes/delete.html.erb

Zakładam, że to się dzieje na developmencie. Prekompilowałeś sobie assety? Zrób bundle exec rake assets:clobber i sprawdź, czy nadal występuje.

Na developmencie. Nic się nie zmieniło po assets:clean :confused:

Ale masz assety prekompilowane? Jaką masz zawartość pod public/assets?

Nie, assety nie są prekompilowane. public/assets zresztą też jest puste. Właściwie to nie istnieje ten folder.

Ok, to jest chyba to:


Faktycznie mam skrypty w body. Zaraz to sprawdzę, ale na 99% to jest to :smile:

Tak jest, dodałem 'data-turbolinks-eval' => false i teraz działa jak trzeba.