问题域
我们有Projects
和Milestones
创建后,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.erb
和edit.html.erb
的视图。这些呈现Milestone
。原始方法(所有资源嵌套)
<%= form_for([@project, @milestone]) do |f| %>
...
<% end %>
由于资源的嵌套,我们需要使用
_form.html.erb
和Project
作为参数。上面相同的代码对于
Milestone
和new
都适用。因为原始方法假定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 %>