如何在不同路由的Rails中自定义form_for?

时间:2012-01-27 22:46:24

标签: ruby-on-rails routing form-for

问题域

  • 我们有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的{​​{1}}视图。这些渲染Milestone

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

_form.html.erb

由于嵌套资源,我们需要<%= form_for([@project, @milestone]) do |f| %> ... <% end %> Project作为参数。

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

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

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

Milestone

对于<%= form_for([@project, @milestone]) do |f| %> ... <% end %> 上的所有其他REST操作,我们希望Milestone看起来像这样:

_form.html.erb

所以......

当前的解决方案并不漂亮:

  • 查看代码检查&#34; new&#34;或非 - &#34;新&#34;行动称之为
  • 使用&#34;如果&#34;测试以选择视图应执行的代码(如上所述)

它不干,它很乱,感觉应该有更优雅的方式。

会感激任何意见。 Rails的速度还很快。在此先感谢;)

2 个答案:

答案 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等可能会有所不同。还可以灵活地添加其他字段,文本等。