使用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
相关产品推荐
相关产品推荐

