Ruby on Rails:如何在静态主页上显示帖子

时间:2018-04-07 05:15:16

标签: ruby-on-rails ruby

我正在编写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

3 个答案:

答案 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