Rails中Turbo表单提交如何配置实现多目标Frame更新
问题结论
该需求可实现,但无法仅靠给表单的turbo_frame属性赋值单个固定值完成多Frame更新,需要配合Turbo Streams响应实现。
表单属性配置
表单上的data-turbo-frame属性设置为_top即可,同时建议显式指定表单提交优先接收Turbo Stream格式响应,避免触发默认的单Frame替换逻辑,代码示例:
= turbo_frame_tag 'container' = turbo_frame_tag 'frame1' = form_with url: path, data: { turbo_frame: '_top' }, format: :turbo_stream do |f| // 表单字段与提交按钮 = turbo_frame_tag 'frame2' // frame2原有内容,不会被更新 = turbo_frame_tag 'frame3' // frame3原有内容
注意:不要尝试在turbo_frame属性中传入多个Frame id(例如空格分隔写frame1 frame3),Turbo原生不支持多目标Frame匹配,这种写法会直接导致匹配失败,触发整页跳转。
控制器侧实现
表单对应的控制器动作不需要渲染完整页面,也不需要渲染父容器container的模板,直接返回Turbo Stream格式响应即可。在对应的.turbo_stream.erb模板中,只声明需要替换的frame1和frame3内容,完全不涉及frame2的相关逻辑,Turbo执行响应中的Stream指令时,只会更新你指定的两个Frame,不会对frame2做任何修改,示例模板:
# app/views/对应控制器/动作名.turbo_stream.erb = turbo_stream.replace 'frame1' do = turbo_frame_tag 'frame1' do // 重新渲染frame1内的表单、提示信息等更新后的内容 = turbo_stream.replace 'frame3' do = turbo_frame_tag 'frame3' do // 重新渲染frame3需要更新的内容
内容的提问来源于stack exchange,提问作者Petros Kalafatidis
相关产品推荐
相关产品推荐

