Ссылка "Удалить" отправляет "Get" вместо "Delete" в представлении Rails 3
Я использую 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
9 ответов
Убедитесь, что ваш <head>
Раздел в макете включает в себя следующее:
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
В Rails 3 запросы на удаление обрабатываются с помощью JavaScript, чтобы обеспечить правильную отправку запроса. Если у вас нет метатегов csrf и необходимого кода JavaScript, ссылки удаления не будут работать. :defaults
Файлы JavaScript включают, среди прочего, prototype.js и application.js. Последний содержит материал, который делает ссылку работающей, но опирается на платформу Prototype.
Если вы не хотите использовать стандартные библиотеки JavaScript Prototype, есть порты application.js для нескольких других сред. Например, вы можете найти jQuery здесь.
Кнопки будут работать независимо от JavaScript, так как HTML-код, сгенерированный с помощью button_to
включает в себя всю необходимую информацию самостоятельно. Вот почему вы видите, что кнопка работает, а ссылка - нет.
Похоже
<%= javascript_include_tag :defaults %>
больше не поддерживается
Вместо этого вы должны использовать
<%= javascript_include_tag 'application' %>
У меня была такая же проблема с рельсами 5.2.3, и это мне помогло:
макет головы:
<%= javascript_include_tag "rails-ujs" %>
config / инициализаторы / активы
Rails.application.config.assets.precompile += %w( rails-ujs.js )
В моем случае я использовал следующее.
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
Я также использовал jQuery, включив jQuery чуть ниже прототипа JS по умолчанию. Это вызывало какой-то конфликт.
Деструктивные действия должны быть выполнены в форме представления - http://www.w3.org/2001/tag/doc/whenToUseGet.html
Вы можете стилизовать кнопку соответственно для метода удаления или Использовать форму.
У меня была такая же проблема в Rails 6. Решение Romalex включает:
<%= javascript_include_tag "rails-ujs" %>
в теге заголовка &
Rails.application.config.assets.precompile += %w( rails-ujs.js )
в config/initializers/assets также работал над решением проблемы с destroy_user_session в devise, которая не DELETE.
Таким образом, это решение также относится к этому вопросу . Ruby on Rails - разработка пользователей/sign_out не работает
В моем случае с 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>
Это будет работать Проблема в том, что вам нужно пройти по правильному пути, чтобы маршрут получил его.
<%= link_to 'Delete', post_path(post.id), :method => :delete %>
Попробуйте это.. это простое изменение..
добавьте это в ваш файл route.rb
get '/lists/:list_id/comments/:id' => 'comments#destroy'
Я сделал это изменение, и теперь оно работает..