合并两个表单轨道

时间:2013-07-21 17:48:12

标签: ruby-on-rails ruby-on-rails-3

基本上我有像@ user1224344这样的问题:

How to submit multiple, duplicate forms from same page in Rails - preferably with one button

第一个答案看起来相当不错,但我作为rails初学者在我的项目中转换它有问题。好吧,我有两个具有相同控制器的表单,只需一个提交按钮即可保存:

<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content %></th>
<th><%= f.hidden_field :note, :id => "canvascontent" %></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary', :onclick => "sketch.toDataURL()"  %></th>
<th><input type="button" onclick="sketch.clearRecording()" class="btn btn-small btn-danger" value="Löschen"></th>
<% end %>
</tr>
</table>


<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content , :id => "inputbox"%></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary'%></th>
<% end %>
</tr>
</table>

感谢您的帮助!特别是在周日晚上(至少在德国这里)

1 个答案:

答案 0 :(得分:3)

你很亲密。

诀窍是两个表单应该在提交它们的表单中嵌套,这应该是另一个模型。我不知道你的应用程序是如何组合在一起的,但我会假设患者有很多治疗方法。您的模型应包括:

<强> patient.rb

attr_accessible :treatments_attributes, etc...
has_many :treatments
accepts_nested_attributes_for :treatments

<强> treatment.rb

belongs_to :patient

如您所见,患者接受治疗的属性(因此该模型中的第三行和第一行)。因此,您实际上需要将治疗表格包裹在患者表格中,以便您使用其嵌套治疗提交患者表格。像这样:

<%= form_for @patient do |f| %>
  <%= f.fields_for @patient.build_treatment do |tf| %>
    <%= render 'treatment_form', locals: { form: tf } %>
  <% end %>
  <%= f.fields_for @patient.build_treatment do |tf| %>
    <%= render 'treatment_form', locals: { form: tf } %>
  <% end %>
  <%= f.submit %>
<% end %>

因此,您已经为患者提供了一个表单,即提交两个与患者自动关联的治疗表单。我可能搞砸了那里的一些细节,但那是基本的想法。

编辑 - 您可能需要查看this out。最好将处理表单对象的构建放在控制器中,就像在那个问题中那样。您可能想查看Rails API for more specific help on accepts_nested_attributes_for.

另外,如果不清楚,“locals”事件只是将处理表单对象传递给变量名称“form”下的partial,所以在那部分中,你要写&lt;%= form.label:无论是%&gt; ......等,在那部分内。

如果在控制器中构建表单对象 -

@patient.build_treatments #may not be exactly this, but it's close

- 然后您可以在视图中执行此操作:

<%= f.fields_for :treatment do |tf| %>

另外,如果不清楚,根据您的上述代码,您的部分会看起来像这样:

<table width="100%">
  <tr>
    <th><%= form.collection_select :category_id, Category.find(:all), :id, :typ %></th>
    <th><%= form.text_field :content , :id => "inputbox"%></th>
    <th><%= form.text_field :day, :value => Date.today %></th>
  </tr>
</table>

其他可能更直观的布局:

主视图

<%= form_for @patient do |f| %>
  <%= render 'treatment_form', form: f %>
<% end %>

部分视图

<%= form.fields_for :treatment do |field| %>
  <% field.label :whatever %> #...

换句话说,你将调用到partial_for里面的fields_for,这可能更有意义。实际上不应该改变真正有效的方式。