ruby-on-rails 如何在Rails with Turbo中使用button_to调用确认提示

pgccezyw  于 2022-12-30  发布在  Ruby
关注(0)|答案(4)|浏览(193)

以前在Rails中使用button_to标记时,可以使用如下所示的确认对话框

<%= button_to 'Destroy', @post, method: :delete, data: { confirm: 'Are you sure?' } %>

data: { confirm: 'Are you sure?' }是Rails魔术数据属性,由@rails/ujs库在幕后使用
在Rails7之后,这个库在缺省情况下不再打开。请使用Turbo库来代替这个Rails
现在这个代码不起作用了
官方Rails文档和Turbo handbook中没有相关信息
我所尝试的

<%= button_to 'Destroy', @post, method: :delete, data: { turbo_confirm: 'Are you sure?' } %>
<%= button_to 'Destroy', @post, method: :delete, data: { 'turbo-confirm': 'Are you sure?' } %>

但是没有结果
我在SO上没有找到解决方案,但是在Hotwire forum上找到了,这个方案有刺激作用,我只是稍微改进了一下
一个二个一个一个
它可以工作,但是相当困难,而且看起来很难看,我们已经习惯了Rails的酷

7xllpg7q

7xllpg7q1#

在Rails with Turbo(不带rails-ujs)中,使用button_to调用确认弹出窗口时,我们需要使用如下代码

<%= button_to 'Destroy', @post, method: :delete, form: { data: { turbo_confirm: 'Are you sure?' } } %>

<%= button_to 'Destroy', @post, method: :delete, form: { data: { 'turbo-confirm': 'Are you sure?' } } %>

两者都生成data-turbo-confirm属性
所以我们需要添加这个属性,而不是提交按钮(像rails-ujs中那样),而是直接添加到包含这个按钮的表单中(让我提醒你,这个标签生成了一个带有按钮的表单)

ee7vknir

ee7vknir2#

这在7.0.3中有点复杂,如果是使用turbo的页面,则如下所示:

<%= button_to "Delete",
                  user_path(user),
                  method: :delete,
                  class: "button tight danger",
                  form: { 
                   data: { 
                     turbo_confirm: "Are you sure you want delete?"
                   }
                  } %>

这就形成了一个小的形式,现在如果你使用turbo,但不是在那个特定的页面上,你不再从旧的rails ujs得到简单的comfirm: 'message',而是必须使用刺激控制器。

# app/javascript/controllers/confirmation_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static values = { message: String };

  confirm(event) {
    if (!(window.confirm(this.messageValue))) {
      event.preventDefault();
      event.stopImmediatePropagation();
    };
  };
}

那么

# app/javascript/controllers/index.js
import ConfirmationController from "./confirmation_controller"
application.register("confirmation", ConfirmationController)

那么

<%= button_to "Delete",
                  user_path(user),
                  method: :delete,
                  class: "button danger",
                  form: {
                    data: {
                      turbo: false,
                      controller: "confirmation",
                      action: 'submit->confirmation#confirm',
                      confirmation_message_value: "Are you sure you want to delete?",
                    }
                  } %>

这是一个扫兴的铁路删除功能,但如果你想使用hotwire你需要承诺完全购买整个生态系统。

envsm3lx

envsm3lx3#

我不完全理解这一点,但以下内容对我很有效
第一个月
an svg which shows a trash can
<% end %>.
我也没有任何看起来像OP的confirmation_controller的内容

mgdq6dx1

mgdq6dx14#

不是最初的问题,但对于rails 7.0.4,它的工作原理相同(无刺激):

<%= link_to("Del",
            del_path,
            data: { turbo_method: :delete, turbo_confirm: "Sure?" }) %>

相关问题