1

我正在构建一个ToDo应用程序,试图获得流利的Rails。我的应用中有四个级别的层次结构。使用form_for与嵌套资源

  1. 用户
  2. 目标(每个用户的多个目标)
  3. 任务(每个目标多任务)
  4. 子任务(每个任务的多个子任务)

我有一个工作的前端形式对于每个使用嵌套资源的应用程序。我的routes.rb有这样的事情

resources :goal do 
    resources :task do 
    resources :subtask 
    end 
end 

我想现在要做的是,有所有这些形式的用户控制器的一个观点正确。

这是我试图创建表格:

<%= form_for @task, url: {controller: 'task', action: 'create'} do |f| %> 

<%= f.label :description %> 

<%= f.text_field :description %> 

<%= f.submit "Add Goal", class: "btn" %> 

<% end %> 

但我最终得到这个错误

No route matches {:action=>"create", :controller=>"task", :id=>"1"} 

的:ID => 1对应于用户页面我在( http://localhost:3000/user/1

我的理解是,我没有提供此步骤的目标goal_id。不知道如何实现这一点。

我注意到的另一件事是,对rake routes的响应显示了很多URI路径,但对POST方法没有任何影响。它不允许我使用url:form_for中的路径,因为它与POST方法不匹配。

所以我的问题是:

  1. 如何路由的form_for,当你有嵌套的资源?
  2. 如何在使用form_for时提供父资源的ID,以便我的创建操作正确路由?
+0

大概这将给你一些想法:HTTP://计算器.com/questions/2034700/form-for-with-nested-resources – dp7

+0

执行rake路由并检查创建任务路由。用户ID可能不会被指示为:id。 – Syl

+0

不,我有'/ goal /:goal_id/task'作为创建任务路线。是的,在这条路线上没有:id,我仍然需要在某处提供:goal_id,我不知道如何去做(正如我在问题中提到的那样)。 –

回答

1

将路由嵌套到两层以下通常是不好的做法。我会改变你的路线:

resources :goal do 
    resources :task 
    end 

resources :task do 
     resources :subtask 
    end 

现在,如果你在命令行中运行“捆绑高管耙路线”,你会看到所有的嵌套的路线及其相应的助手。你目前的问题在于form_for方法。您需要添加资源的嵌套与在这种情况下应该是:

<%= form_for [@goal,@task] do |f| %> 
    blah blah 
<% end %> 

最后,@goal也仍然不确定,所以你需要在你的任务“新”的行动来定义它控制器。这通常是通过传递您的任务将通过params散列关联的目标的id和用于获得“新”形式的“link_to”来完成的。然后在你的任务控制器中的新动作:

@goal = Goal.find(params[:goal_id]) #The parameter can be named anything 
@task = Task.new 
在“创建”行动

那么你应该有该协会提出:

@task = Goal.tasks.new(task_params) 
if @task.save 
    flash[:success] = "Woot" 
    redirect_to somewhere_awesome_path 
else 
    whatever 
end 
+0

使用'form_for [@ goal,@ task]'给出错误'未定义的方法goal_tasks_path为#<#

+0

感谢您的回复,但它是一个很好的答案。只需要多一点你的帮助:) –

+0

没问题。您想要在连接到显示表单的操作中定义'@goal'和'@task',所以在这种情况下,您可以在Show操作中的用户控制器中定义它们。然后,您也可以像“url:{controller:'task',action:'create'}”部分那样定义表单将要提交的路径。至于传递goal_id,你可以将它作为一个hidden_​​field添加到表单中的一个预设值。例如<%= f.hidden_​​field:目标,值:'任何值'%> – bkunzi01