ruby-on-rails Ruby On Rails 7 -删除方法不起作用

xqkwcwgp  于 2023-01-03  发布在  Ruby
关注(0)|答案(9)|浏览(247)

在我的RoR项目中,我的delete方法不起作用。这很奇怪,因为一天前它还在工作,但现在它所做的一切都将我重定向到"朋友"页面。另一件需要注意的事情是,当删除朋友时,"你确定吗?"的弹出对话框也不会出现。我在网上读到一些解决方案,声明要放置"//= require jquery "和"//=需要jquery_ujs "在您的javascript文件,但所有我能找到的是我的manifest.js文件在我的" app/assets/config "目录。
任何帮助都将不胜感激。

    • 索引. 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 %>
    • 清单. js**
//= link_tree ../images
//= link_tree ../builds
//= require jquery
//= require jquery_ujs
vnjpjtjt

vnjpjtjt1#

在Rails 7中,“旧的”指定delete方法的方法不起作用,我猜测是从rails-ujs到turbo的变化是罪魁祸首。
我是这样解决问题的:
路由:销毁用户会话删除/用户/注销(.:format)设备/会话#销毁
.html.企业资源管理系统:

<%= 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.企业资源管理系统:

<%= link_to t('navigation.sign_out'), destroy_user_session_path, data: { "turbo-method": :delete }, class: "btn btn-danger ml-3" %>

.html:(注意数据加速方法=“删除”)

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

ybzsozfc2#

对于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" %>
q43xntqr

q43xntqr3#

Rails 7使用Turbo和刺激框架来提高前端性能。
您需要安装turbo和stimulation。在您的终端上运行以下命令:

$ 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" %>
vx6bjr1n

vx6bjr1n4#

您需要转到https://guides.rubyonrails.org/getting_started.html的第7.5节。
我们需要设置“销毁”链接的数据加速方法和数据加速确认HTML属性。

阅读整个第7.5节,包括两个示例中的销毁操作。还要在控制台中保存日志,并在单击“删除”按钮时观察错误。为了避免出现拍脑袋的情况,在销毁操作中,尝试按照rails guides redirect_to whatever_path, status: :see_otherstatus添加到redirect_to这也适用于删除对象并呈现新对象时,您需要设置status :unprocessable_entity,这会导致服务器响应422。

这里的关键是要确保您在Turbo的link_to中有turbo_method: :delete,然后,method: :delete将GET更改为删除,最后,当您使用redirect_to时,您的destroy action有一个状态,以避免在浏览器使用DELETE方法将您重定向到另一个位置时出错。

<%= link_to "Delete", friend, method: :delete, data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
v7pvogib

v7pvogib5#

对于那些仍然有问题的人,这里有一些其他的步骤可以帮助:
Rails version: 7.0.3.1
参考:Rails 7: link_to method: :delete not working
遵循以下步骤:

  • 第一个月
  • 添加宝石importmap-rails
  • 安装导入Maprails 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
fhg3lkii

fhg3lkii6#

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

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

您还需要为这个请求找到正确的路径,您可以执行以下操作来为朋友找到匹配的路由。

rails routes | grep friend
knpiaxh1

knpiaxh17#

我把我的应用程序升级到了Rails7,但是不想使用导入Map、turbo等,所以我想出了自己的Javascript解决方案,在销毁链接中添加了一个确认对话框。
首先,我把所有的链接都转换成buttons,这样触发delete请求就容易多了:

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

(Note Rails会自动将这些按钮 Package 在一个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 data属性中提取出来,因此您可以在那里放置任何想要的字符串或消息。

cygmwpex

cygmwpex8#

我也遇到了同样的问题,我很困惑。我尝试了所有的方法,但都失败了,日志总是显示页面渲染为HTML,而不是turbo流。然后我切换到Opera浏览器(从chrome),一切都按预期运行。有意义吗?

vuktfyat

vuktfyat9#

也可以使用button_to代替link_to

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

相关问题