Ruby 在 Rails 7 - 删除方法无效

Ruby On Rails 7 - Delete method not working

在我的 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

您需要传递控制器的路径,而不仅仅是对象。

<%= link_to 'delete', 
          friend_path(friend),
          :method => :delete,
          :confirm => "are you sure?", 
          class: "btn btn-danger btn-sm" %>

您还需要为这个请求找到正确的路径,您可以通过以下方式为朋友找到匹配的路径。

rails routes | grep friend

在Rails 7 中,指定删除方法的“旧”方式不起作用。我的猜测是从 rails-ujs 到 turbo 的变化是罪魁祸首。 Rails-ujs was moved into Rails as of version 5.1 and Hotwire Turbo replaces it 在 rails 7.

这就是我解决问题的方法:

路线:destroy_user_session 删除 /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:(注意数据方法=“删除”)

<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”

用 (solution source)

解决了

.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>

您也可以使用 button_to 代替 link_to

<%= button_to friend_path(friend), method: :delete do %>
  Delete
<% end %>

如果您希望确认消息在开箱即用的 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" %>