Ruby on rails 将父资源id从窗体传递给创建操作

Ruby on rails 将父资源id从窗体传递给创建操作,ruby-on-rails,forms,resources,Ruby On Rails,Forms,Resources,我有一个论坛,有许多主题s。我的路线如下: GET /forums/:forum_id/topics/new => Topics#new POST /topics => Topics#create 这就是我的问题开始的地方: = form_for @topic do |topic_form| 此表单映射到POST/topics路径。必须提供论坛id,以保存主题。它可用于new操作,但我找不到任何方法将其传递给create操作 我尝试将路

我有一个
论坛
,有许多
主题
s。我的路线如下:

GET  /forums/:forum_id/topics/new => Topics#new
POST /topics                      => Topics#create
这就是我的问题开始的地方:

= form_for @topic do |topic_form|
此表单映射到
POST/topics
路径。必须提供
论坛id
,以保存主题。它可用于
new
操作,但我找不到任何方法将其传递给
create
操作

我尝试将路线更改为:

GET  /forums/:forum_id/topics/new => Topics#new
POST /forums/:forum_id/topics     => Topics#create
但是现在,
forum\u id
在主题参数散列之外结束:

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

如何解决此问题?

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

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

这假设您的论坛模型有很多:topics

不应该是
@topic=@Forum.topics.build(params[:topic])
,或者甚至使用
create
而不是
build
并跳过保存调用?这两种方法都是有效的,但我永远不会说您应该总是使用这个而不是那个,尤其是在Ruby和Rails中,通常有许多不同的方法来实现相同的目标。我更喜欢在创建之前实例化。至于new或build,我不知道在关联中使用new时有什么区别,但new对我来说和build一样有效。