Rails:论坛有多个主题,保存关联?

时间:2012-02-23 09:38:48

标签: ruby-on-rails ruby-on-rails-3 model-view-controller routes belongs-to

首先我可能会以错误的方式解决这个问题,所以我先给出一些背景知识。

从标题中可以看出,我正在从头开始构建一个论坛。我认为它工作正常;但是,我有点不确定如何在其控制器的主题“创建”方法中更新/保存论坛对象。

我试图做的事情: 在“新”方法中,我通过路由发送了论坛的ID。所以在新主题页面上有一个如下所示的地址:“localhost:3000 / new-topic / 1”。一个是论坛的ID。在方法本身中,我尝试将其附加到新主题对象。

@topic = Topic.new
@topic.forum = Forum.find(params[:id])

然后我的创建方法尝试使用该论坛。

@topic = Topic.new(params[:topic])
@topic.forum.topics << @topic #Simplified down.
if @topic.save
  @topic.forum.save
...

我觉得我这样做是错误的。我正在查看某人的教程,他们通过调用params [:forum_id]来获得论坛,但是他们没有向他们展示他们为实现这一点而做的路由。

如何正确地执行此操作和/或正确的方法是什么?为了记录,我确实计划在Topic =&gt;中使用相同的方法。邮政协会。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您应该使用嵌套的REST路由:

# routes.rb
resources :forums do
  resources :topics
end

这将产生以下路线:

GET  /forums/:forum_id/topics/new # displays the form
POST /forums/:forum_id/topics     # creates the topic

并且在控制器中你应该使用构建器,它们有几个优点,如安全性,范围保留等:

def new
  @forum = Forum.find(params[:forum_id])
  @topic = @forum.topics.build

def create
  @forum = Forum.find(params[:forum_id])
  @topic = @forum.topics.build(params[:topic])
  if @topic.save
    ...

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-resources