You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用button_to刷新Turbo Frame时出现‘content missing’错误的排查求助

button_to刷新Turbo Frame时出现‘content missing’错误的排查求助

我正在开发一个基于Rails + Turbo的应用,核心需求是用Turbo实现局部页面刷新——只在需要的时候更新页面的部分区域。但现在碰到了一个棘手的问题:

我有一个button_to,点击后会创建一个名为Tracklist的Rails对象,按预期应该刷新id为tracklist的Turbo Frame,但实际点击后,这个Frame直接消失,页面显示“content missing”错误。按钮和目标Frame不在同一个Turbo Frame里,控制器的create方法看起来执行完成了,浏览器控制台也没有任何报错信息,实在摸不着头脑,来求助大家帮忙排查!

相关代码片段:

1. 触发请求的button_to

<%= button_to "", tracklists_create_path, 
  params: {tracklist: { track_ids: @tracks.map(&:id) }}, 
  method: :post, 
  class: "icon btn-play", 
  title: "Play playlist", 
  data: { turbo_frame: 'tracklist' } %>

2. TracklistsController的create方法

def create
  session_id = session.id.to_s
  # 移除已存在的tracklist(如果有的话)
  Tracklist.find_by(session: session_id).destroy if Tracklist.find_by(session: session_id)

  @tracklist = Tracklist.new(tracklist_params)
  @tracklist.session = session_id
  track_ids = tracklist_params[:track_ids].map(&:to_i)
  track_ids.each do |t|
    @tracklist.tracks << Track.find(t)
  end

  respond_to do |format|
    if @tracklist.save
      format.html { redirect_back fallback_location: root_path }
    else
      format.html { redirect_back fallback_location: root_path }
    end
  end
end

3. Tracklist对应的Turbo Frame(application/_tracklist.html.erb)

<%= turbo_frame_tag "tracklist" do %>
  <% tracklist = Tracklist.find_by(session: session.id.to_s) %>
  <% if tracklist.present? %>
    <div id="queue-container" class="queue-container">
      <button class="toggle" data-expanded="Close playlist" data-collapsed="View playlist" onclick="document.getElementById('queue-container').classList.toggle('active')"></button>
      <div id="queue" class="queue">
        <% tracklist.tracks.each_with_index do |track, index| %>
          <div class="play-track-wrapper">
            <a class="play-tracks" data-index="<%= index %>" data-id="<%= track.track_id %>" data-turbo-frame="mediaplayer" href="#"><%= track.title %></a>
            <button class="play-track-remove" title="Remove"></button>
          </div>
        <% end %>
      </div>
    </div>
  <% end %>
<% end %>

我自己的一些排查思路(不确定是否正确)

  • Turbo的响应期望不匹配:我在create方法里用了redirect_back,但当按钮指定了data-turbo-frame时,Turbo是不是期望服务器直接返回目标Frame的更新内容,而不是重定向?如果返回重定向,Turbo可能找不到对应的Frame内容,所以抛出“content missing”?
  • Session一致性问题:创建和渲染Tracklist都依赖session.id,会不会在请求过程中Session出现了变化?不过目前没看到相关报错,暂时存疑。
  • Frame渲染逻辑问题:当Tracklist不存在时,Turbo Frame里是空内容,会不会Turbo把空内容识别为“缺失”?但我是先删除旧的再创建新的,理论上应该不会出现Tracklist不存在的情况吧?

有没有大佬能帮忙指出问题所在,或者给一些更有效的排查方法?比如怎么查看Turbo请求的具体响应内容,或者有没有隐藏的日志可以看?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:08:07