0

我创建了一个需要显示来自 2 个表(父表和子表)的数据的表单。提交表单时,仅更新子字段(父字段仅用于显示)。在显示父模型字段时,需要保护这些字段不被更新(最好通过表单构建器,而不是通过 css)。

FWIW 这是一个非常常见的主/细节用例。但是我找不到任何这样的例子——我见过的大多数例子似乎都是微不足道的/单一模型显示/更新,其中所有显示的字段都是可更新的)。

任何想法/示例/建议/教程/现实世界的示例,多模型 Rails 表单都会有所帮助。

TIA

4

4 回答 4

1

只是出于兴趣,当您只想更新子记录时,为什么还要费心创建多模型表单呢?我的建议是保持表单简单,即使其成为子表单并仅显示父记录中的数据。如果需要,您甚至可以将显示设置为表单的一部分,尽管我认为这可能会让用户失望。

如果你真的需要做你正在做的事情,我仍然会使用 CSS 来禁用/只读输入字段,并且在你的控制器更新操作中,只将你想要更新的属性传递给 update_attributes方法调用。

最后,也许研究一下防止您可能想要attr_protected保护的字段免受意外批量分配的方法。

于 2009-08-18T09:06:40.907 回答
0

我同意 tsdbrown,我认为不需要复杂的表格。如果您想了解更多关于复杂表单的信息,或者您真的很想使用复杂表单,我建议您观看Railscasts 剧集(73 - 75)。

于 2009-08-18T09:12:52.187 回答
0

正如 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 建议很棒)。

于 2009-08-18T13:44:58.507 回答
0

感谢帮助解决我的问题/问题的回复。只是想关闭它,以防将来对其他人有所帮助。

原来我在尝试引用我的父数据元素 (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 %>

有时很难只见树木不见森林!希望这对其他人有帮助。

于 2009-08-18T18:07:22.820 回答