Ruby On Rails 7 - метод удаления не работает
в моем проекте RoR мой метод удаления не работает. Это странно, потому что он работал день назад, но теперь все, что он делает, перенаправляет меня на страницу «друга». Еще следует отметить всплывающее диалоговое окно «Вы уверены?» также не отображается при удалении друга, когда он работал ранее. Я прочитал несколько решений в Интернете, в которых говорится, что нужно поместить «// = require jquery» и «// = require jquery_ujs» в ваш файл javascript, но все, что я смог найти, это мой файл manifest.js в моем каталоге «app / assets / config».
Любая помощь будет принята с благодарностью.
index.html.erb
<% if user_signed_in? %>
<table class="table table-striped table-bordered table-hover">
<thead class="thead-dark">
<tr>
<th>Name</th>
<th>Email</th>
<th>Phone</th>
<th>Twitter</th>
<th>User ID</th>
<th></th>
</tr>
</thead>
<tbody>
<% @friends.each do |friend| %>
<% if friend.user == current_user %>
<tr>
<td>
<%= link_to friend.first_name + " " + friend.last_name, friend, style: 'text-decoration:none' %>
</td>
<td><%= friend.email %></td>
<td><%= friend.phone %></td>
<td><%= friend.twitter %></td>
<td><%= friend.user_id %></td>
<td>
<%= link_to 'delete',
friend,
:method => :delete,
:confirm => "are you sure?",
class: "btn btn-danger btn-sm" %>
</td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
<br>
<% else %>
<h1>Welcome to the Friend App</h1>
<% end %>
manifest.js
//= link_tree ../images
//= link_tree ../builds
//= require jquery
//= require jquery_ujs
9 ответов
В Rails 7 «старый» способ указания метода удаления не работает. Я предполагаю, что виноват переход с rails-ujs на turbo. Rails-ujs был перенесен в Rails с версии 5.1, а в rails 7.
Вот как я решил свою проблему:
маршрут: destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
.html.erb:
<%= link_to t('navigation.sign_out'), destroy_user_session_path, method: :delete, class: "btn btn-danger ml-3" %>
html: (обратите внимание на data-method="delete")
<a class="btn btn-danger ml-3" rel="nofollow" data-method="delete" href="/users/sign_out"><span class="translation_missing" title="translation missing: en.navigation.sign_out">Sign Out</span></a>
Ошибка: маршрут не соответствует [GET] "/users/sign_out"
Решил это с помощью (Hotwire Turbo заменяет егоисточник решения )
.html.erb:
<%= link_to t('navigation.sign_out'), destroy_user_session_path, data: { "turbo-method": :delete }, class: "btn btn-danger ml-3" %>
.html: (обратите внимание на data-turbo-method="delete")
<a data-turbo-method="delete" class="btn btn-danger ml-3" href="/users/sign_out"><span class="translation_missing" title="translation missing: en.navigation.sign_out">Sign Out</span></a>
Небольшое примечание, если вы хотите, чтобы подтверждающее сообщение работало в rails 7 из коробки:
<%= link_to t('navigation.sign_out'),
destroy_user_session_path,
data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' },
class: "btn btn-danger ml-3" %>
Rails 7 использует Turbo и платформу stimulus для повышения производительности интерфейса.
Нужно установить турбо и стимул. Запустите следующие команды на своем терминале:
$ rails importmap:install
$ rails turbo:install stimulus:install
Убедитесь, что вы используетеturbo_method
нравиться:
<%= link_to "Sign Out", destroy_user_session_path, data: { turbo_method: :delete }, class: "nav-link" %>
Вам нужно перейти к разделу 7.5 https://guides.rubyonrails.org/getting_started.html . Это объясняет, почему
нам нужно установить HTML-атрибуты data-turbo-method и data-turbo-confirm ссылки «Уничтожить».
Прочтите весь раздел 7.5, включая действие destroy в обоих примерах . Также сохраните журнал в своей консоли и наблюдайте за ошибками, когда вы нажимаете кнопку «Удалить». Чтобы избежать головокружительных моментов, в действии уничтожения попробуйте добавить статус в redirect_to в соответствии с направляющими рельсами.redirect_to whatever_path, status: :see_other
это также относится к тому, когда вы удаляете объект и рендерите новый, вам нужно установитьstatus :unprocessable_entity
что приводит к ответу сервера на 422.
главное здесь убедиться, что у вас естьturbo_method: :delete
в вашем link_to для Turbo, тоmethod: :delete
изменить GET на удаление и, наконец, вашdestroy action
чтобы иметь статус, когда вы используете redirect_to, чтобы избежать ошибок, когда/если браузер перенаправляет вас в другое место с помощью метода DELETE.
<%= link_to "Delete", friend, method: :delete, data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
У меня была такая же проблема, и я озадачен. Я пробовал все, но не мог уничтожить, и журналы всегда показывали рендеринг страницы как HTML, а не как турбопоток. Затем я переключился на браузер Opera (из Chrome), и все заработало, как и ожидалось. иметь смысл?
Я обновил свое приложение до Rails 7, но не хотел использовать карты импорта, турбо и т. д., поэтому я придумал собственное решение Javascript для добавления диалогового окна подтверждения к моим ссылкам на уничтожение.
Прежде всего, я превратил все свои ссылки вbuttons
что значительно упрощает запуск запроса:
def link_to_destroy(object)
path = send("#{controller_name.singularize}_url", object)
button_to "Destroy", path, :method => :delete, :data => { :confirm => "Are you sure?" }, :form_class => "confirm_destroy", :class => "destroy_icon"
end
(Обратите внимание, что Rails автоматически поместит эти кнопки вform
тег сdelete
метод включен. Я обнаружил, что стилизовать эти кнопки на удивление легко. Мне пришлось изменить только одну строку кода в моем CSS.)
Это Javascript, который я использую для запуска диалога подтверждения:
function ConfirmDestroy() {
const forms = document.querySelectorAll('.confirm_destroy');
forms.forEach(form => {
form.addEventListener('submit', function(e) {
handleSubmit(form, e);
});
});
function handleSubmit(form, e) {
e.preventDefault();
let message = form.querySelector('button').dataset.confirm; // pull the actual confirmation message from the data-attribute 'confirm' to support multiple languages
if (!confirm(message)) {
return false;
}
form.submit();
}
}
document.addEventListener('DOMContentLoaded', ConfirmDestroy);
Я тестировал его в последних версиях Chrome, Safari и Firefox на Mac и пока не сталкивался с какими-либо проблемами.
Преимущество этого решения в том, что оно также поддерживает несколько языков. Фактическое подтверждающее сообщение будет просто извлечено изconfirm
атрибут данных. Таким образом, вы можете поместить туда любую строку или сообщение, которое хотите.
Для тех, у кого все еще есть проблемы с этим, вот несколько других шагов, которые могут помочь:
Версия рельсов: 7.0.3.1
Ссылка: Rails 7: метод link_to: :delete не работает
выполните следующие шаги:
-
bundle add hotwire-rails
- добавить драгоценный камень
importmap-rails
- установить импорткарту
rails importmap:install
- установить горячую проводку
rails hotwire:install
и следующий код работает:
%td= link_to t('common.destroy'), task, data: { turbo_method: :delete, turbo_confirm: t('common.confirm') }
в качестве дополнительной информации, используя:
-
gem hamlit
-
gem simple_form
Вы также можете использовать button_to вместо link_to
<%= button_to friend_path(friend), method: :delete do %>
Delete
<% end %>
Вам нужно передать путь для контроллера, а не только для объекта.
<%= link_to 'delete',
friend_path(friend),
:method => :delete,
:confirm => "are you sure?",
class: "btn btn-danger btn-sm" %>
Вам также необходимо найти правильный путь для этого запроса, вы можете сделать следующее, чтобы найти совпадающие маршруты для друга.
rails routes | grep friend