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一样有效。