Ruby on Rails:静态首页展示文章时遇nil类each方法未定义错误
解决Rails首页展示文章时的"undefined method 'each' for nil:NilClass"错误
嘿,这个问题我之前踩过坑,本质是控制器和视图的对应关系搞混了!咱们一步步拆解问题和解决方案:
问题根源
你提到首页是由「静态页面控制器」提供的,但你把获取文章列表的@posts = Post.order("created_at desc").limit(5)写在了PostsController的home方法里——这两个是完全独立的控制器动作!
当用户访问首页时,Rails会执行静态页面控制器的home方法,而不是PostsController的home方法。这就导致渲染home.html.erb时,@posts根本没被赋值,自然是nil,调用each方法就会报错。
解决方案
1. 把文章查询逻辑移到正确的控制器里
打开你的静态页面控制器(比如app/controllers/static_pages_controller.rb),把获取文章的代码写到它的home动作里:
class StaticPagesController < ApplicationController def home # 用符号形式的order更符合Rails最佳实践,比字符串更安全 @posts = Post.order(created_at: :desc).limit(5) end end
2. 确认路由配置正确
确保你的首页路由指向静态页面控制器的home动作,打开config/routes.rb检查:
# 设置首页路由 root 'static_pages#home' # 如果是自定义的/home路径,也可以这么写 get '/home', to: 'static_pages#home'
3. 优化视图代码(可选但更健壮)
你的home.html.erb(应该在app/views/static_pages/目录下)可以保留循环,但建议加个空值判断,避免没有文章时的尴尬:
<% if @posts.present? %> <% @posts.each do |post| %> <%= post.comment %> <% end %> <% else %> <p>还没有任何文章哦~</p> <% end %>
这样调整后,首页就能正常加载最新的5篇文章啦!
内容的提问来源于stack exchange,提问作者SapphireJones
相关产品推荐
相关产品推荐

