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

