Turbo 8:布局中yield外的turbo-frame无法渲染内容问题咨询
Turbo 8全局turbo-frame无法渲染内容的问题分析与解决
这不是Turbo的预期行为,问题根源在于请求edit页面时,服务器返回的HTML里存在两个ID为modal的turbo-frame,具体逻辑如下:
- 你的布局文件
application.html.erb里已经定义了一个全局空的<turbo-frame id="modal"> - 点击带
data: {turbo_frame: 'modal'}的编辑链接时,Turbo会请求edit_post_path,服务器用application布局渲染edit页面,最终返回的HTML同时包含布局里的空modal frame,以及edit页面里带内容的modal frame - Turbo处理响应时,会匹配第一个ID为
modal的turbo-frame(也就是布局里的空frame),将它的内容替换到当前页面的全局modal frame中,自然看不到任何内容
解决方案一:让edit页面返回不带布局的turbo-frame
在PostsController的edit动作中添加layout: false,确保服务器返回的响应里只有edit页面中带内容的modal frame,Turbo就能正确提取内容替换到全局frame:
def edit @post = Post.find(params[:id]) layout: false end
解决方案二:改用Turbo Stream定向更新全局frame
- 修改编辑链接,指定请求Turbo Stream格式:
<%= link_to 'edit', edit_post_path(post), format: :turbo_stream %>
- 创建
app/views/posts/edit.turbo_stream.erb文件,写入替换全局modal frame的逻辑:
<%= turbo_stream.replace "modal" do %> Render edit form ... <% end %>
- 保持布局里的全局
<turbo-frame id="modal">不变,点击链接后Turbo Stream会直接替换全局frame的内容,彻底避免ID冲突问题
内容的提问来源于stack exchange,提问作者kirley
相关产品推荐
相关产品推荐

