问题域


我们有ProjectsMilestones
创建后,Milestone具有Project


路由

在我最初的方法中,我有类似以下内容:

  resources :projects do
    resources :milestones
  end


因此,所有RESTful路由如下所示:projects/PROJ_ID/milestones/ID

这对我来说有点长了,您不需要一直使用Project ID:仅在创建Milestone时才需要。

现在,路线如下所示:

  resources :projects do
    resources :milestones, :only => [:new, :create]
  end

  resources :milestones, :except => [:new, :create]


当我创建一个新的Milestone(第一条路线)时:


我使用嵌套资源
这是为了得到Project ID
我们正在创建一个新的Milestone,我们需要一个Project ID


使用其他Milestone操作(第二条路线):


我使用标准的Milestone资源
我们已经在现有的Milestone上进行操作
Milestone已经带有Project ID


问题:呈现__form.html.erb

一切都很好,除非我进入new.html.erbedit.html.erb的视图。这些呈现Milestone

原始方法(所有资源嵌套)

<%= form_for([@project, @milestone]) do |f| %>
  ...
<% end %>


由于资源的嵌套,我们需要使用_form.html.erbProject作为参数。

上面相同的代码对于Milestonenew都适用。因为原始方法假定edit为所有REST操作嵌套路由。

当前方法(仅创建/新嵌套)

创建新的Project/Milestone时,我们希望_form.html.erb看起来像这样:

<%= form_for([@project, @milestone]) do |f| %>
  ...
<% end %>


对于Milestone上的所有其他REST操作,我们希望Milestone看起来像这样:

<%= form_for(@milestone) do |f| %>
  ...
<% end %>


所以...

当前的解决方案不是很好:


查看代码检查是否调用了“新”或“新”动作
使用“ if”测试选择视图应执行的代码(如上所述)


它不是DRY,而是混乱,感觉应该有一种更优雅的方式。

将不胜感激任何输入。 Rails仍在加速发展。提前致谢 ;)

最佳答案

您可以将变量与资源一起传递给_form部分。例如:

新:

render "form", :resource => [@project, @milestone]


编辑:

render "form", :resource => @milestone


表格内

<%= form_for resource do |f| %>
  ...
<% end %>

10-08 00:37