使用Hotwire/Turbo Frames实现实时搜索时出现Content Missing错误
Turbo Frames实时搜索无结果时出现「Content Missing」错误的解决办法
问题场景
用Turbo Frames实现的实时搜索功能,有匹配结果时一切正常,但输入无匹配的关键词后,浏览器显示「Content Missing」错误,对应DOM中出现:
<turbo-frame id="tools" src="https://localhost:3000/tools?query=pressure+washer" complete=""> <strong class="turbo-frame-error">Content missing</strong> </turbo-frame>
当前环境:Rails 7.1.0.alpha、turbo-rails 1.4.0
问题根源
核心问题出在Tool模型的search scope上:当搜索无结果时,这个scope返回的是nil,而非空的ActiveRecord关系集合。控制器中@tools被赋值为nil后,渲染视图时无法生成预期的HTML结构,Turbo找不到对应id的frame内容,因此抛出「Content Missing」错误。
解决方案
1. 修复模型的search scope
将scope中返回nil的逻辑改为返回空的ActiveRecord关系,确保@tools始终是可迭代的集合(即使为空)。修改tool.rb:
scope :search, -> (query) do return none if query.blank? joins(:categories).where("tools.name ILIKE :query OR brand ILIKE :query OR notes ILIKE :query OR part_number ILIKE :query OR categories.name ILIKE :query", query: "%#{query}%") end
这里用none方法替代原有的return,返回一个空的、支持链式调用的ActiveRecord关系对象,而非nil。
2. 添加空状态提示(可选)
在Turbo Frame内明确处理无结果的情况,确保无论有无数据,都有合法的HTML内容返回。修改index.html.erb:
<%= turbo_frame_tag :tools do %> <ul role="list"> <%= render partial: "tool", collection: @tools %> </ul> <% if @tools.empty? %> <p>未找到匹配的工具</p> <% end %> <% end %>
3. 验证控制器逻辑
确认控制器index方法中,@tools在任何场景下都被赋值为ActiveRecord集合。当前控制器逻辑已经覆盖了params[:query]存在/不存在的情况,修复scope后,@tools会始终是有数据或空的集合,不会再出现nil。
调试技巧
- 在控制器
index方法中添加raise @tools.inspect,查看无搜索结果时@tools的实际值,确认是否为nil。 - 查看服务器日志,检查无结果请求的视图渲染过程是否有异常抛出。
内容的提问来源于stack exchange,提问作者Shpigford
相关产品推荐
相关产品推荐

