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
一切都很好,除非我查看了new.html.erb
和edit.html.erb
的{{1}}视图。这些渲染Milestone
。
原始方法(嵌套所有资源)
_form.html.erb
由于嵌套资源,我们需要<%= form_for([@project, @milestone]) do |f| %>
...
<% end %>
和Project
作为参数。
上述相同的代码适用于Milestone
和new
。因为原始方法假定所有REST操作都有edit
嵌套路由。
当前方法(仅创建/新嵌套)
我们希望Project/Milestone
在我们创建新的_form.html.erb
时看起来像这样:
Milestone
对于<%= form_for([@project, @milestone]) do |f| %>
...
<% end %>
上的所有其他REST操作,我们希望Milestone
看起来像这样:
_form.html.erb
当前的解决方案并不漂亮:
它不干,它很乱,感觉应该有更优雅的方式。
会感激任何意见。 Rails的速度还很快。在此先感谢;)
答案 0 :(得分:4)
您可以将带有资源的变量传递给_form
partial。例如:
新:
render "form", :resource => [@project, @milestone]
编辑:
render "form", :resource => @milestone
表格内
<%= form_for resource do |f| %>
...
<% end %>
答案 1 :(得分:2)
我通常会将表单的内容放在partial中,并在每个文件中写出form_for。
更新
<%= form_for @milestone do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<%= f.submit "Update my object" %>
<% end %>
创建:
<%= form_for [@project, @milestone] do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<%= f.submit "Create Object" %>
<% end %>
因为表单字段通常不会更改,但按钮文本,表单ID等可能会有所不同。还可以灵活地添加其他字段,文本等。