将父资源ID传递给表单中的创建操作

时间:2011-01-30 02:22:23

标签: ruby-on-rails forms resources

我的Forum有很多Topic个。我的路线如下:

GET  /forums/:forum_id/topics/new => Topics#new
POST /topics                      => Topics#create

这是我的问题开始的地方:

= form_for @topic do |topic_form|

此表单映射到POST /topics路由。必须提供forum_id才能保存主题。它可用于new操作,但我找不到任何方法将其传递给create操作。

我尝试将路线更改为:

GET  /forums/:forum_id/topics/new => Topics#new
POST /forums/:forum_id/topics     => Topics#create

但现在forum_id最终超出了主题参数hash:

{ topic: { title: "Test" }, commit: "Create Topic", forum_id: 1 }

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我认为最合适的方法是像第二个例子中那样路由它。然后在创建操作中,您可以首先实例化论坛以确保它有效,然后从论坛创建主题。它可能看起来像这样:

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

这假定您的论坛模型has_many:topics