Ссылка на удаление отправляет «Get» вместо «Delete» в представлении Rails 3 - PullRequest
39 голосов
/ 23 сентября 2010

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

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

# 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 

Ответы [ 8 ]

48 голосов
/ 23 сентября 2010

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

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

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

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

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

17 голосов
/ 04 октября 2013

выглядит как

<%= javascript_include_tag :defaults %>

больше не поддерживается

http://apidock.com/rails/ActionView/Helpers/AssetTagHelper/JavascriptTagHelpers/javascript_include_tag

Вместо этого вы должны использовать

<%= javascript_include_tag 'application' %>
3 голосов
/ 25 марта 2011

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

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

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

2 голосов
/ 30 марта 2019

У меня была такая же проблема в рельсах 5.2.3, и это помогло мне:

макет головы:

<%= javascript_include_tag "rails-ujs" %>

конфиг / Инициализаторы / активы

Rails.application.config.assets.precompile += %w( rails-ujs.js )
2 голосов
/ 19 ноября 2012

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

Можно соответствующим образом оформить кнопку для метода удаления или Использовать форму.

0 голосов
/ 20 ноября 2018

В моем случае с Rails 5 я использовал в своем макете следующее:

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

Таким образом:

... </title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
...
 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
 </head>
0 голосов
/ 04 апреля 2016

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

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

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

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

0 голосов
/ 22 января 2016

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

<%= link_to 'Delete', post_path(post.id), :method => :delete %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...