Spree模板调用@taxonomies.each报nil:NilClass无each方法错误如何解决
Spree全站加载taxonomies报错解决方案
错误核心原因是视图中调用的@taxonomies变量未被正确赋值,为nil状态下调用each方法触发异常,按以下步骤排查修复:
1. 修正已知代码错误
- 模型名拼写错误:你的代码中写的
Tataxonomy是错名,Spree官方分类模型为Spree::Taxonomy - 赋值方法未触发:自定义的
some_action没有绑定到控制器执行流程,不会自动运行 - 装饰器未完成注入:现有装饰器代码没有和原
Spree::ApplicationController绑定,逻辑不会生效
2. 替换为正确的装饰器代码
# 路径:app/decorators/controllers/spree/application_controller_decorator.rb module Spree module ApplicationControllerDecorator def self.prepended(base) # 配置全局前置回调,所有页面请求前自动加载taxonomies base.before_action :load_global_taxonomies end def load_global_taxonomies @taxonomies = Spree::Taxonomy.all end end end # 注入装饰器逻辑到原生控制器 Spree::ApplicationController.prepend(Spree::ApplicationControllerDecorator)
3. 可选:视图增加容错处理
为了避免极端场景下变量为空触发报错,可在头部模板中增加存在性判断:
<% if @taxonomies&.any? %> <% @taxonomies.each do |taxonomy| %> <% cache [I18n.locale, taxonomy, max_level, @taxon] do %> <% if taxonomy.root.children.any? %> <!-- 原有分类渲染逻辑 --> <% end %> <% end %> <% end %> <% end %>
4. 生效验证
- 重启Rails服务,装饰器修改需要重启服务才会加载
- 可在
load_global_taxonomies方法中增加日志打印,确认方法被调用、变量被正确赋值:Rails.logger.debug "全局加载分类数量: #{@taxonomies.count}"
内容的提问来源于stack exchange,提问作者jjplack
相关产品推荐
相关产品推荐

