Ruby on rails Rails-两个相关资源的嵌套显示

Ruby on rails Rails-两个相关资源的嵌套显示,ruby-on-rails,methods,instance,Ruby On Rails,Methods,Instance,我有一个包含许多帖子的事件模型,我试图以大纲格式显示事件和帖子的相关内容,如下所示: Event 1 Post 1 Post 2 Event 2 Post 3 Post 4 ... 我目前有以下内容,由于某种原因,控制器在我的事件模型中找不到“postlist”方法(作用于@eventlist实例) class Event < ActiveRecord::Base belongs_to :group has_many :posts def postlist

我有一个包含许多帖子的事件模型,我试图以大纲格式显示事件和帖子的相关内容,如下所示:

Event 1
  Post 1
  Post 2
Event 2
  Post 3
  Post 4
...
我目前有以下内容,由于某种原因,控制器在我的事件模型中找不到“postlist”方法(作用于@eventlist实例)

class Event < ActiveRecord::Base
  belongs_to :group
  has_many :posts

  def postlist
    Post.from_event_posts(self)
  end

end


class Post < ActiveRecord::Base
  belongs_to :event
  belongs_to :user

  def self.from_event_posts(event)
    where(event_id: event.id)
  end

end


class GroupsController < ApplicationController
  def show
    @eventlist = @group.eventlist #returns hash of events for a group - confirmed working

    #Get list of posts for each event
    @postlist = @eventlist.postlist
  end
end



<%= @eventlist.each do |e| %>
<ul>
  <li><%= e.title %></li>
  <%= e.postlist.each do |p| %>
  <ul>
    <li><%= p.comment %> | <%=p.user_id%> </li>
  </ul>
  <%end%>
</ul>
<%end%>
class事件
    • |

    我得到了以下错误:未定义的#

    方法“postlist”得到了这个错误,因为您不是在一个事件上调用方法postlist,而是在一个事件数组上调用方法postlist。顺便说一句,Rails中的一般惯例是调用这些变量
    @events
    @posts
    (只是一个提示,以后习惯会很方便)

    你能给我们看看你的集体课吗

    我会这样写:

    def show
      @events = @group.events.includes(:posts)
    end
    
    includes方法将posts表连接到正在执行的SQL查询,在呈现视图之前加载posts。您的视图如下所示:

    <%= @events.each do |e| %>
      <ul>
        <li><%= e.title %></li>
        <%= e.posts.each do |p| %>
          <ul>
            <li><%= p.comment %> | <%=p.user_id%> </li>
          </ul>
        <%end%>
      </ul>
    <%end%>
    
    
    
      • |

    我相信您可以删除postlist和eventlist方法。这些功能已经存在。

    谢谢,这非常有效。虽然我刚刚开始Rails的开发,但我注意到使用@events/@posts是一种约定,但是如果将每个全局变量都命名为同一个东西,会不会让人感到困惑呢?也许在一开始,但以后会变得很自然,相信我:)
    @post
    @posts
    post
    的含义完全不同。事实上,我觉得它相当不错!