我创建了一个需要显示来自 2 个表(父表和子表)的数据的表单。提交表单时,仅更新子字段(父字段仅用于显示)。在显示父模型字段时,需要保护这些字段不被更新(最好通过表单构建器,而不是通过 css)。
FWIW 这是一个非常常见的主/细节用例。但是我找不到任何这样的例子——我见过的大多数例子似乎都是微不足道的/单一模型显示/更新,其中所有显示的字段都是可更新的)。
任何想法/示例/建议/教程/现实世界的示例,多模型 Rails 表单都会有所帮助。
TIA
我创建了一个需要显示来自 2 个表(父表和子表)的数据的表单。提交表单时,仅更新子字段(父字段仅用于显示)。在显示父模型字段时,需要保护这些字段不被更新(最好通过表单构建器,而不是通过 css)。
FWIW 这是一个非常常见的主/细节用例。但是我找不到任何这样的例子——我见过的大多数例子似乎都是微不足道的/单一模型显示/更新,其中所有显示的字段都是可更新的)。
任何想法/示例/建议/教程/现实世界的示例,多模型 Rails 表单都会有所帮助。
TIA
只是出于兴趣,当您只想更新子记录时,为什么还要费心创建多模型表单呢?我的建议是保持表单简单,即使其成为子表单并仅显示父记录中的数据。如果需要,您甚至可以将显示设置为表单的一部分,尽管我认为这可能会让用户失望。
如果你真的需要做你正在做的事情,我仍然会使用 CSS 来禁用/只读输入字段,并且在你的控制器更新操作中,只将你想要更新的属性传递给 update_attributes
方法调用。
最后,也许研究一下防止您可能想要attr_protected
保护的字段免受意外批量分配的方法。
我同意 tsdbrown,我认为不需要复杂的表格。如果您想了解更多关于复杂表单的信息,或者您真的很想使用复杂表单,我建议您观看Railscasts 剧集(73 - 75)。
正如 tsdbrown 之前所说,您正在为您的表单添加一个不需要的复杂层。如果您只想更新详细模型,同时显示其父级的一些信息,您可以这样做:
Order number: <%= @line_item.order.number %>
Order date: <%= @line_item.order.order_date %>
<% form_for @line_item do |f| %>
<%= f.label :quantity %>
<%= f.text_edit :quantity %>
<% end %>
当您想同时编辑两者时,您可以研究 field_for 和嵌套表单方法(之前提到的 Railscasts 建议很棒)。
感谢帮助解决我的问题/问题的回复。只是想关闭它,以防将来对其他人有所帮助。
原来我在尝试引用我的父数据元素 (patients.lname) 时遇到错误,因为它是在结果数组中传递的,而不是作为单个结果传递的。在我的视图控制器中,我有:
@visit = Visit.all(:select => "visits.id, visits.visittype, visits.visitdate, events.patient_id, patients.lname",
:conditions => ["visits.id = ?",params[:id] ],
:joins => "INNER JOIN events on events.id = visits.event_id INNER JOIN patients on patients.id = events.patient_id" )
在我看来,我有(这给了我一个无效的参考,因为我在上面做一个查找):
<h1>Editing visit for patient :
<%= @visit.lname %> # should be <%= @visit[0].lname %>
</h1>
下面是改进(和更简单)的版本,我可以在其中找到我需要的特定记录(基本上用 find first 替换 find all):
@visit = Visit.find(:first, :select => "visits.id, visits.visittype, visits.visitdate, events.patient_id, patients.lname",
:conditions => ["visits.id = ?",params[:id] ],
:joins => "INNER JOIN events on events.id = visits.event_id INNER JOIN patients on patients.id = events.patient_id" )
在视图中:
<% form_for(@visit, :builder => LabelFormBuilder) do |f| %>
<%= f.error_messages %>
Name: <%= @visit.lname %>
<%= f.text_field :visittype %>
<%= f.date_select :visitdate %>
<p>
<%= f.submit 'Update' %>
</p>
<% end %>
有时很难只见树木不见森林!希望这对其他人有帮助。