Rails 6.1中如何将外部button_tag关联到form_with表单提交
完全可以实现,有两种常用实现方案,同时需要先修复你现有代码的一个隐含问题:
你当前把form_with直接放在<tbody>标签内不符合HTML规范,<tbody>的直接子元素仅允许为<tr>,浏览器渲染时会自动将form标签移到表格外部,导致表单结构异常,建议你将form_with移到整个<table>标签的外部,包裹整个表格。
方案1:使用HTML原生属性关联(无需额外写JS,最简便)
这种方式依赖HTML原生的按钮form属性,直接将外部按钮和指定表单绑定即可:
- 给
form_with添加唯一的id属性:
<%= form_with(id: "delete-multiple-clients-form", url: destroy_multiple_clients_path, data: { controller: 'form-submission', form_submission_target: "delete_multiple_form" }) do |form| %>
- 给外部的
button_tag添加form参数、指定提交类型:
<%= button_tag "Delete Selected2", type: :submit, form: "delete-multiple-clients-form", class: "btn btn-link dropdown-item", data: { action: "form-submission#destroyMultiple" } %>
配置完成后浏览器会原生识别该按钮为对应表单的提交按钮,无需放在表单内部即可正常触发提交。
方案2:通过现有Stimulus控制器提交(适合需要前置校验/额外逻辑的场景)
你已经给表单绑定了Stimulus目标,直接在控制器方法中调用表单提交即可:
// app/javascript/controllers/form_submission_controller.js import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = ["deleteMultipleForm"] destroyMultiple() { // 可在这里添加自定义逻辑,比如删除二次确认 // if (!confirm("确定删除选中的客户端记录吗?")) return this.deleteMultipleFormTarget.submit() } }
该方案不需要修改按钮和表单的HTML属性,只要按钮的data-action绑定正确即可正常触发。
内容的提问来源于stack exchange,提问作者ctilley79
相关产品推荐
相关产品推荐

