我创建了一个表单,需要显示来自2个表(父表和子表)的数据。提交表单时,仅更新子字段(父字段仅用于显示)。在显示父模型字段时,需要保护这些字段不受更新(最好通过formbuilder,而不是通过css)。
FWIW这是一个非常常见的主/详细用例。但是我还没有找到任何这方面的例子 - 我见过的大多数例子似乎都是微不足道/单一模型显示/更新,其中所有显示的字段都是可更新的。
现实世界,多模型Rails表单的任何想法/样本/建议/教程/示例都会有所帮助。
TIA
答案 0 :(得分:1)
出于兴趣,当您只想更新子记录时,为什么还要编写创建多模型表单的动作呢?我的建议是保持你的形式简单,即。使其成为子表单,只显示父记录中的数据。如果需要,您甚至可以将该显示的样式看作是表单的一部分,尽管我认为这可能会让用户失望。
如果你真的需要做你正在做的事情,我仍然会使用CSS来禁用/只读取输入字段,并且在你的控制器更新操作中,只将想要更新的属性传递给update_attributes
方法调用。
最后,可以查看attr_protected
方法,以防止可能希望保护字段免受意外批量分配。
答案 1 :(得分:0)
我同意tsdbrown,我认为不需要复杂的表格。如果您想了解更多有关复杂表格的内容,或者您真的想要使用复杂的表格,我建议您观看Railscasts episodes(73 - 75)。
答案 2 :(得分: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之前提到的建议很棒)。
答案 3 :(得分:0)
有助于解决我的问题/问题的回复的Thx。只是想关闭它,以防将来帮助其他人。
原来我在尝试引用我的父数据元素(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替换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 %>
有时很难看到木头的树木!希望这有助于其他人。