我正在编写Rails应用程序,我尝试做的是显示主页上的所有帖子。我有一个静态页面的控制器,主页来自哪里,另一个是帖子的控制器。到目前为止,我有这个:
home.html.erb :
<% @posts.each do |post| %>
<%= post.comment %>
<% end %>
帖子控制器:
def home
@posts = Post.order("created_at desc").limit(5)
end
我从查看其他答案得到了一般性的想法,但即使我在数据库中有多个帖子,我仍然会收到undefined method 'each' for nil:NilClass
错误。
到目前为止,如果这种关系对它产生影响,社区就有很多帖子。 谢谢。
静态页面控制器:
class PagesController < ApplicationController
def show
render template: "pages/#{params[:page]}"
end
end
答案 0 :(得分:1)
默认情况下,您无需告知StaticController
执行home
中的PostsController
操作。
Vishal是正确的,你应该将逻辑移到StaticController
,但是仍然没有什么可以称之为该行动。
解决方案是在@posts
路由中实例化#index
,这样当有人访问索引时,就会执行该逻辑。
在我看来,更好的解决方案是在#home
中将StaticController
作为私有方法(可能会将其重命名为更具描述性的内容......我在下面使用load_posts
) ,然后在文件的顶部创建一个before_action
,告诉Rails在呈现#load_posts
时需要index
的内容
class StaticController < ApplicationController
before_action :load_posts, only: :index
def index
#logic for your index
end
private
def load_posts
@posts = Post.order("created_at desc").limit(5)
end
end
答案 1 :(得分:0)
也许,只需将代码@posts = Post.order("created_at desc").limit(5)
放入静态页面控制器中? PostsController
默认情况下不会呈现home.erb.html
,它有自己的观点。
答案 2 :(得分:0)
正如你所说,主页即将来临的静态控制器,我不确定,为什么你在Posts Controller
为家创建不同的动作。将您的主动作放在静态控制器中。
<强> StaticController 强>
def home
@posts = Post.order("created_at desc").limit(5)
end