你已经很接近了。
诀窍是两种形式都应该是nested在提交它们的表单中,这应该是另一个模型。我不知道你的应用程序是如何组合在一起的,但我假设患者有很多治疗。您的模型应包含以下内容:
病人.rb
attr_accessible :treatments_attributes, etc...
has_many :treatments
accepts_nested_attributes_for :treatments
治疗.rb
belongs_to :patient
如你看到的,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 %>
所以你有一张表格patient提交两种治疗表格,自动与患者关联。我可能搞砸了一些细节,但这就是基本想法。
EDIT——你可能想检查一下this out。最好将处理表单对象的构建放入控制器中,就像在该问题中所做的那样。您可能想查看Rails API 有关 Accepts_nested_attributes_for 的更多具体帮助。
另外,如果不清楚,“locals”只是将处理表单对象传递给变量名“form”下的部分,因此在该部分中,您可以编写 。 ..等,在该部分内。
如果您在控制器中构建表单对象——
@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 %> #...
换句话说,您可以将调用移至部分内部的 fields_for ,这可能更有意义。实际上不应该改变任何事情的实际运作方式。