Удалить ссылку отправляет "Get" вместо "Удалить" в режиме Rails 3

Я использую Rails 3 и имею страницу, которая выводит список сообщений из базы данных. Я хочу удалить сообщение из ссылки.

Второй пример ниже работает, но первый - нет. Кто-нибудь знает, почему первый не будет работать? В моем представлении содержится:

# this link sends a "GET" request which asks for the #show function  
<%= link_to 'Delete', post, :method => :delete %>

# this link sends the proper "DELETE" request which asks for the #destroy function
<%= button_to 'Delete', post, :method => :delete %>

Мой файл маршрутов содержит следующее:

resources :posts 

Ответ 1

Убедитесь, что ваш раздел <head> в макете содержит следующее:

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

В Rails 3 запросы удаления обрабатываются с помощью JavaScript, чтобы гарантировать, что запрос отправлен правильно. Если у вас нет мета-тегов csrf и требуемого кода JavaScript, удаление ссылок не будет работать. Файлы :defaults JavaScript включают, среди прочего, prototype.js и application.js. Последний содержит материал, который заставляет работу ссылки, но полагается на структуру Prototype.

Если вы не хотите использовать библиотеки JavaScript прототипа по умолчанию, есть порты application.js для нескольких других фреймворков. Например, вы можете найти jQuery one здесь.

Кнопки будут работать независимо от JavaScript, так как HTML-код, сгенерированный с помощью button_to, включает всю необходимую информацию сам по себе. Вот почему вы видите, что кнопка работает, пока ссылка отсутствует.

Ответ 3

В моем случае я использовал следующее.

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

Я также использовал jQuery, включив jQuery чуть ниже стандартного прототипа JS. Это вызывало какой-то конфликт.

Ответ 4

Деструктивные действия должны выполняться как представление формы - http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

Вы можете правильно начертить кнопку для метода удаления или Использовать форму.

Ответ 5

Это сработает. Проблема заключается в том, что вам нужно передать ему правильный путь, чтобы маршрут получил его.

<%= link_to 'Delete', post_path(post.id), :method => :delete %>

Ответ 6

Попробуйте это.. его простое изменение..

добавьте это в свой файл route.rb

get '/lists/: list_id/comments/: id' = > 'comments # destroy'

Я сделал это изменение и теперь его работаю.