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