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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:30:15