Rails Hotwire:Turbo Frame外按钮无法更新内容问题求助
Rails Hotwire:Turbo Frame外按钮无法刷新时间的问题修复
问题场景
在学习Rails Hotwire时,遇到一个基础问题:想要通过Turbo Frame外的按钮刷新页面上的当前时间。按钮在Frame内时功能正常,但移到Frame外后,点击按钮服务器能返回正确的turbo-stream响应(Content-Type为text/vnd.turbo-stream.html),前后端无报错,但页面时间就是不更新。
无法工作的代码示例
index.html.haml
%h1 The current time is: = turbo_frame_tag "time_frame" do %span= @time %div = button_to "Refresh Time", root_path, method: :get, remote: true, data: { turbo_frame: "time_frame" }
MainController.rb
def index @time = Time.zone.now respond_to do |format| format.turbo_stream do render(turbo_stream: turbo_stream.replace("time_frame", partial: "time_partial")) end format.html end end
_time_partial.html.haml
%span= @time
错误原因
data: { turbo_frame: "time_frame" }属性干扰Turbo Stream处理:这个属性的作用是让Turbo把请求返回的HTML内容加载到指定的Turbo Frame中,但你的服务器返回的是turbo-stream格式,不是普通HTML,这个属性会让Turbo忽略返回的turbo-stream,自然不会执行更新操作。remote: true完全多余:这是Rails UJS时代的写法,Hotwire的Turbo默认会接管所有表单和链接的异步请求,不需要额外添加这个属性。- Turbo Stream替换目标与Partial内容不匹配:你的turbo-stream指令是替换
time_frame这个Turbo Frame元素,但Partial里只有<span>,第一次替换后页面上的turbo_frame元素会被<span>取代,后续请求会找不到目标(不过这不是本次页面不更新的直接原因)。
修复步骤
第一步:修正按钮代码
移除多余的remote: true和干扰的data: { turbo_frame: "time_frame" }属性,让Turbo正常处理turbo-stream响应:
%div = button_to "Refresh Time", root_path, method: :get
第二步:调整Partial保持结构一致性(推荐)
修改_time_partial.html.haml,让它包含完整的Turbo Frame标签,确保每次替换后页面上始终存在time_frame目标元素:
= turbo_frame_tag "time_frame" do %span= @time
验证效果
修改完成后,点击Frame外的按钮,服务器返回的turbo-stream会正确执行replace操作,页面上的时间就会实时更新了。
内容的提问来源于stack exchange,提问作者Adam Jacobson
相关产品推荐
相关产品推荐

