Rails 4 - 检索关联的孙子

时间:2015-10-24 14:32:08

标签: ruby-on-rails-4 associations

我在rails 4中的论坛应用程序中遇到了关联问题。这可能很简单,但我找不到解决问题的任何解决方案(也是我对rails的新手)。 这是论坛层次结构:主题>主题>发布(类似评论)

我想要的是,在主题节目动作中,检索它自己的帖子。

在我的模特中我有

#Theme model
class Theme < ActiveRecord::Base
    has_many :topics, dependent: :destroy
    has_many :posts
end

#Topic model
class Topic < ActiveRecord::Base
    belongs_to :theme
    has_many :posts, dependent: :destroy
end

#Post model
class Post < ActiveRecord::Base
    belongs_to :theme
    belongs_to :topic
end

在我的主题和主题控制器中,我有这个(它有效!):

#show action on Themes Controller
class ThemesController < ApplicationController
    def show 
        @theme = Theme.find(params[:id])
        @topics = @theme.topics
    end
end

#show action on topics controller
class TopicsController < ApplicationController
def show
    @theme = Theme.find(params[:theme_id])
    @topic = @theme.topics.find(params[:id])
end

这是有效的,在我看来,我可以展示我得到了什么主题以及他们得到了什么主题。 要访问我在主题中的帖子,我正在尝试;

#still inside show action on topics controller
class TopicsController < ApplicationController
def show
    @theme = Theme.find(params[:theme_id])
    @topic = @theme.topics.find(params[:id])
    @posts = @theme.topics.posts
end

但它完全不起作用!我收到了错误

NoMethodError in ForumTopicsController#show
undefined method `posts' for #<ForumTopic::ActiveRecord_Associations_CollectionProxy:0x007fddd8c14158>

如果我尝试创建新帖子直接转到它的'新动作'网址,它可以工作,我认为它会保存与其主题和主题相关的帖子。 这是我的路线:

Rails.application.routes.draw do
resources :forum_themes do
    resources :forum_topics do
        resources :forum_posts
    end
 end

我想要的只是在主题视图中访问我的帖子; - ; 我尝试了一些与“收集”有关的事情,但它没有用! (也许我就是那个根本不工作的人:P)

请帮忙!

更新

这些是我的迁移文件,不知道它是否有用......

#migration file of themes
class CreateThemes < ActiveRecord::Migration
    def change
        create_table :themes do |t|
            t.string :title
            t.text :description
            t.timestamps null: false
        end
    end
end
#migration file of topics
class CreateTopics < ActiveRecord::Migration
    def change
        create_table :topics do |t|
            t.string :author
            t.string :title
            t.text :body
            t.references :theme, index: true
            t.timestamps null: false
         end
   end
end
#migration file of posts
class CreatePosts < ActiveRecord::Migration
    def change
        create_table :posts do |t|
            t.string :title
            t.text :content
            t.references :topic, index: true
            t.references :theme, index: true
            t.timestamps null: false
         end
    end
end

1 个答案:

答案 0 :(得分:1)

  

未定义的方法`posts'for   ForumTopic :: ActiveRecord_Associations_CollectionProxy:0x007fddd8c14158

问题在于@posts = @theme.topics.posts@theme.topics会返回 相关主题 的所有 主题 ,因此您无法追加 发布

相反,您需要在下面的视图中循环显示@theme.topics,以显示与 主题相关联的 帖子

<% @theme.topics.each do |topic| %>
  <%= topic.posts %>
<% end %>