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

Rails 7.1.2俄罗斯套娃缓存:内部片段缓存为空求助

Rails 7.1.2 嵌套片段缓存存空HTML的问题解决

核心原因

问题出在嵌套缓存块的输出捕获方式上:
在shared/matrix_box.erb的tag.div构建块中,直接使用cache(image) do ... end(未添加<%=)的写法,会把缓存内容直接输出到响应流,而非作为tag.div的内部HTML内容。当Rails生成缓存片段时,这个cache块的返回值为nil,最终导致缓存存储的是空HTML。而移除cache块后,render的结果会被正常纳入tag.div的内容结构,组件自然能正常渲染。

修复方案

修改shared/matrix_box.erb中的缓存块写法,用<%=包裹cache块,让它的返回值被正确包含到tag.div的内部内容中:

<%= matrix_box(columns: columns, id: object_id) do
  tag.div(class: "panel panel-default") do
    concat(
      tag.div(class: "thumbnail-container") do
        <%= cache(image) do             # 新增 <%= 捕获缓存输出 %>
          render(partial: "shared/interactive_image",
                 locals: image_args)
        end %>                         # 对应闭合标签
      end
    ) if image
    concat(matrix_box_details(presenter, object))
  end
end %>

额外排查点

如果修复后仍有异常,可以检查:

  • 确认image模型存在updated_at字段(从日志中的时间戳来看,此点基本没问题),确保image更新时缓存键能自动失效。
  • 检查image_args传递的presenter是否依赖请求上下文(比如current_user这类请求专属变量),如果有,需要把相关参数加入缓存键,避免缓存内容不符合当前请求场景。

内容的提问来源于stack exchange,提问作者nimmolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:54:54