Nie działa :method => :delete

Hej, mam taki kod:

<%= link_to "Wyloguj", destroy_user_session_path, :method => :delete %>

Jednakże gdy kliknę w odnośnik mam metodę GET zamiast DELETE przez co link nie działa.

Próbowałem rozwiązań ze stack overflow (np. http://stackoverflow.com/questions/4342083/rails-3-link-to-method-delete-not-working), ale nic nie pomaga.

Ogólnie to zauważyłem, że JavaScript nie działa w tym projekcie, jest to dziwne, bo nic nie zmieniałem… Nie działa mi np. accordion z bootstrapa.

Ktoś miał może taki problem, albo naprowadzi gdzie szukać?

rails 3.2.8, ruby 2.0.0
ArchLinux

kod jest dobry, czy nie dokonałeś zmian na routingu, czy rake routes daje Ci - destroy_user_session DELETE ?
miałam podobne problemy z bootstrapem i js ale po przejsciu na rails4 może podbiłeś projekt do 4.

Sprawdź co wyrzuca konsola Javascript w przeglądarce. Prawdopodobnie masz jakiś błąd w JS, który rozkłada skrypty.

Teoretycznie nie powinno to zrobić różnicy, ale spróbuj

<%= button_to "Wyloguj", { controller: :sessions, action: 'destroy' }, method: :delete  %>

Ewidentnie problem z JS, przez co railsy nie symulują Ci rządania Delete. Wrzuć najlepiej swój plik application.js i kawałek layoutu gdzie go załączasz.

Tak jak napisał @skarlcf - przede wszystkim sprawdź, co wyrzuca konsola JS. Możliwe, że to jakaś mała pierdółka, którą po zidentyfikowaniu źródła sam łatwo usuniesz.
EDIT: @ddknapik - Przy “nieudziwnionych” routesach to, co napisałeś, jest równoważne temu, co napisał @esio.

@Lypa, no dlatego napisałem “Teoretycznie nie powinno to zrobić różnicy” :wink:

Masz załączony jquery_ujs w application.js ?

Hej, więc wygląda to tak:

  1. w application.js mam załączone jquery:

// This is a manifest file that'll be compiled into application.js, which will include all the files // listed below. // // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. // // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the // the compiled file. // // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD // GO AFTER THE REQUIRES BELOW. // //= require jquery //= require jquery_ujs //= require_tree . ;
2. rake routes pokazuje, że mam trasę:

    destroy_user_session DELETE /users/sign_out(.:format)                    devise/sessions#destroy
  1. Fragment mojego layout/application.erb:

[code]

XXX <%= javascript_include_tag "application" %> <%= stylesheet_link_tag "application", :media => "all" %> <%= stylesheet_link_tag "bootstrap.min", :media => "all" %> <%= javascript_include_tag "bootstrap" %> <%= javascript_include_tag "bootstrap.min" %> <%= csrf_meta_tags %> [/code] 4. @ddknapik: button_to niby działa, bo wysyła metodę delete, ale jednak wolałbym link_to, tym bardziej, że wcześniej działało.

Jeżeli działa Ci JS, to spróbuj zamiast “method”, dać “data-method”.

Problemem będzie to że w application.js załączasz jquery, później jquery_ujs, który dodaje do niego railsowe bajery, po czym wszystko nadpisujesz w layoucie bo załączasz raz jeszcze jquery.

Wyrzuć poprostu:

<script src="http://code.jquery.com/jquery-latest.js"></script>

Tak samo bootstrapa też wartoby było przenieść do application js (zobacz na gem twitter-bootstrap-rails)

Może to coś pomoże?

http://stackoverflow.com/questions/3774925/delete-link-sends-get-instead-of-delete-in-rails-3-view
http://stackoverflow.com/questions/4606860/rails-3-link-to-to-destroy-not-working

Btw. http://railsforum.com/viewtopic.php?id=38460

[quote]link_to with a method anything other than GET is actually a bad idea, as links can be right clicked and opened in a new tab/window, and because this just copies the url (and not the method) it will break for non-get links. Also, links are clicked on by web page indexing spiders, and even though the links in question are probably only available to logged in users (and therefore not spiders) it’s still bad practise.
It’s better to use button_to instead, which makes rails generate a mini-form to produce the same result.

From a practical point of view buttons are better (for the above reasons) but they’re also better from a conceptual point of view: generally speaking, links should “take you somewhere”, whereas buttons should “do something”. It’s better to keep these two basic functionalities seperate.[/quote]

Ok, zainstalowałem gem twitter-bootstrap-rails, teraz moje application.erb wygląda tak:

[code]

X <%= javascript_include_tag "application" %> <%= javascript_include_tag :all %> <%= stylesheet_link_tag "application", :media => "all" %> <%= stylesheet_link_tag "bootstrap.min", :media => "all" %> <%= csrf_meta_tags %> [/code] I wszystko działa, nie wiem tylko dlaczego wcześniej działało i nagle przestało.

Zostawiłem link_to, dla mnie to jest wygodniejsze niż button_to.

Dzięki za pomoc.