同一页面复用Rails Partial遇nil报错,如何传入不同控制器对象调用?
解决Rails复用Partial时出现undefined method `each' for nil:NilClass的问题
这个问题很典型——你在partial里直接依赖了实例变量@evaluations,但复用partial的时候,实例变量的作用域是全局的,而且你每次需要传入不同的对象,应该用局部变量来传递数据,而不是实例变量。下面是具体的解决步骤:
1. 修改Partial,替换实例变量为局部变量
打开你的home/partials/_loop_areas.html.erb,把里面的实例变量@evaluations换成局部变量evaluations:
<!-- 原错误代码 --> <% @evaluations.each do |evaluation| %> <!-- 你的循环内容 --> <% end %> <!-- 修改后的正确代码 --> <% evaluations.each do |evaluation| %> <!-- 你的循环内容 --> <% end %>
这样partial就不再依赖控制器里的全局实例变量,而是等待你传入指定的局部变量。
2. 在index.html.erb中调用Partial时,明确传递局部变量
假设你的控制器里有三个需要传入的对象,比如@area1_evaluations、@area2_evaluations、@area3_evaluations,调用partial时通过locals参数传递对应的变量:
<!-- 第一次调用,传入第一个对象 --> <%= render partial: 'home/partials/loop_areas', locals: { evaluations: @area1_evaluations } %> <!-- 第二次调用,传入第二个对象 --> <%= render partial: 'home/partials/loop_areas', locals: { evaluations: @area2_evaluations } %> <!-- 第三次调用,传入第三个对象 --> <%= render partial: 'home/partials/loop_areas', locals: { evaluations: @area3_evaluations } %>
3. 确保控制器中的三个对象都正确赋值
在你的控制器index方法里,要保证三个对象都被正确初始化(哪怕是空数组,也不要让它们为nil):
def index # 根据你的实际业务逻辑查询或初始化三个对象 @area1_evaluations = Evaluation.where(area: "area1").to_a @area2_evaluations = Evaluation.where(area: "area2").to_a @area3_evaluations = Evaluation.where(area: "area3").to_a end
使用.to_a可以确保返回的是数组(即使没有匹配结果,也是空数组),避免出现nil的情况。
4. 可选:给局部变量设置默认值(容错处理)
为了防止调用partial时忘记传参导致错误,可以在partial的开头加上一行,给evaluations设置默认的空数组:
<% evaluations ||= [] %> <% evaluations.each do |evaluation| %> <!-- 你的循环内容 --> <% end %>
这样即使没有传递evaluations,partial也会用空数组执行循环,不会触发undefined method 'each' for nil:NilClass错误。
内容的提问来源于stack exchange,提问作者Eduardorph
相关产品推荐
相关产品推荐

