我在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
答案 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 %>