Rails中使用Turbo提交表单如何保持页面URL不变
该需求可以实现,不需要修改现有路由配置,只需要调整Turbo表单配置或对应响应规则即可。
你当前表单已经指定turbo_frame: 'document_table_content',正常Turbo Frame局部提交默认不会修改页面URL。出现URL自动跳转到submit_path的核心原因是:表单提交后的响应内容中,没有携带id为document_table_content的<turbo-frame>标签,Turbo匹配不到目标frame时会触发全页导航降级,进而修改地址栏。
根据业务场景选择一种即可:
方案1:修正响应的Turbo Frame匹配规则(推荐,符合Turbo设计逻辑)
确保submit_path对应的控制器动作返回的视图中,包含和表单配置id完全一致的turbo_frame标签,HAML示例:= turbo_frame_tag 'document_table_content' do / 此处放需要局部更新的文档表格内容配置完成后Turbo只会提取该frame内的内容替换页面对应区域,全程不会修改地址栏URL。
方案2:显式指定Turbo提交不更新地址
如果不需要依赖Frame的内容匹配规则,可以直接在表单上添加turbo_action: 'none'配置,告知Turbo处理提交后不修改浏览器历史、不更新地址栏,修改后的表单代码:= form_with url: submit_path, multipart: true, data: { turbo_frame: 'document_table_content', turbo_action: 'none' } do |f| Form-row = f.submit t('.submit'), class: 'Button'该配置在Turbo 7.2及以上版本原生支持。
方案3:无页面更新场景的最简配置
如果表单提交后不需要更新任何页面内容,仅做后台逻辑处理,可以直接让submit_path对应的控制器动作返回204状态码:def submit # 原有业务处理逻辑 head :no_content endTurbo收到204 No Content响应时不会做任何页面跳转、内容更新操作,地址栏会完全保持原有地址。
- 由于表单设置了
multipart: true(带文件上传),请确保项目使用的Turbo版本在7.0以上,低版本Turbo对multipart表单的处理存在已知bug,可能触发异常跳转。 - 如果控制器动作处理完逻辑后做了重定向,请确保重定向目标的响应内容同样携带id匹配的turbo_frame标签,否则依然会触发全页导航修改URL。
内容的提问来源于stack exchange,提问作者Petros Kalafatidis

