为什么在动态构建对象数组后会收到未定义的方法?红宝石

时间:2017-06-16 01:19:34

标签: ruby-on-rails arrays ruby

我正在为一个简单的博客构建一个观看次数最多的帖子。每个帖子都有一个视图计数,当为该特定帖子调用Show操作时,该计数会增加。然后在仪表板上,我试图列出前5个帖子。到目前为止,我的代码工作并返回一个帖子数组,其中查看计数最多的帖子是第一个索引,数组中的最后一个索引是视图数量最少的帖子。唯一的事情是当我尝试在视图中迭代数组时,视图返回:

错误

undefined method `title' for nil:NilClass

WHY ???它与对象前面的“#”有关吗?

继承我的代码。

信息中心视图

<h3> Post </h3>
<% @top_posts.each do |post| %>
  <%= post.title %>
<% end %>

控制器方法

def get_top
 @top_posts = []
 counts = []
 @posts = Post.all

 @posts.each do |post|
    counts << post.view_count
 end

 @posts.each do |post|
    if counts.max(5).include?(post.view_count)
        counts.max(5).each do |n|
            if n == post.view_count
              @top_posts[counts.max(5).index(n)] = post
            end
        end 
    end
  end

end


def dashboard
  @posts = Post.all
  get_top
end

Top Podcast对象数组

[#<Post id: 6, title: "Post 6", desc: "", tags: "", view_count: 8, s_desc: "", c_photo: nil, photos: nil, created_at: "2017-06-14 06:02:25", updated_at: "2017-06-15 01:38:40", featured: nil>, #<Post id: 3, title: "post 3", desc: "", tags: "", view_count: 5, s_desc: "", c_photo: nil, photos: nil, created_at: "2017-06-14 05:35:32", updated_at: "2017-06-14 05:35:53", featured: nil>, #<Post id: 5, title: "Post 5", desc: "", tags: "", view_count: 4, s_desc: "", c_photo: nil, photos: nil, created_at: "2017-06-14 06:02:20", updated_at: "2017-06-15 01:38:31", featured: nil>, nil, #<Post id: 4, title: "Post 4", desc: "", tags: "", view_count: 3, s_desc: "", c_photo: nil, photos: nil, created_at: "2017-06-14 05:49:29", updated_at: "2017-06-15 01:38:50", featured: nil>]

2 个答案:

答案 0 :(得分:0)

尝试:

@top_posts << post

而不是:

@top_posts[counts.max(5).index(n)] = post

您不需要设置数组索引。

答案 1 :(得分:0)

另一个答案可能会解决您的错误,但只是想尝试优化您的代码。 那个数组,循环等是不必要的,请你的数据库做那些东西并获得最高职位。获取所有帖子并多次循环...不,请尝试以下操作,希望这是您正在寻找的...

setTag()

那就是它,你的观点不需要改变,并且会按预期工作。