将 Turbo confirm 替换为原生对话框

发布: (2026年2月6日 GMT+8 02:15)
3 min read
原文: Dev.to

Source: Dev.to

Rails 在使用 turbo‑links 时,会为破坏性操作内置一个确认对话框。你可能已经无数次使用过它:

默认的 turbo_confirm 使用浏览器原生的 confirm 对话框。它能工作,但你无法控制其外观或内容。

用原生对话框替换 turbo_confirm

下面是一种最小化的做法,能够让你完全掌控标记和样式。

1. 移除 turbo_confirm 属性

将原来的按钮替换为一个普通按钮,并触发 Stimulus‑style 动作:

2. 添加对话框标记

在按钮后面放置一个 <dialog> 元素:

<dialog closedby="any">
  <h4>真的要删除吗?</h4>

  <p>确定要删除帖子 "" 吗?此操作无法撤销。</p>

  <button type="button" data-action="dialog#close">取消</button>
  <%= button_to "Delete", post_path(@post), method: :delete, data: { turbo_confirm: false } %>
</dialog>
  • closedby="any" 允许用户点击对话框外部或按 Esc 键来关闭对话框。
  • 内部的 button_to 执行实际的删除操作。

3. 引入 Attractive.js

在布局中加入 Attractive.js(例如 app/views/layouts/application.html.erb):

该库提供 dialog#openModal 动作,无需自定义 JavaScript。更多细节请参阅文档

4. 为对话框添加样式

你可以随意为对话框设置样式。仓库中包含一个基础样式示例。想了解更高级的 CSS 技巧,请参考现代 CSS 相关文章。

何时使用哪种方案?

场景推荐方案
在后台或内部工具中快速一次性确认保持使用 turbo_confirm(简单,兼容性好)
需要自定义内容、品牌或额外上下文使用上面描述的自定义对话框方法

自定义对话框保持简洁——无需额外的 JavaScript——并且让你对用户体验拥有完整的控制。 ✨

Back to Blog

相关文章

阅读更多 »

React 函数组件和类组件

函数组件 在 React 中,函数组件被定义为简单的 JavaScript 函数,它们从父组件接收 props 属性作为参数……