Rails表单构建器 - 如何显示只读字段或保护字段

时间:2009-08-18 08:44:47

标签: ruby-on-rails forms master-detail

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

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

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

TIA

4 个答案:

答案 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 %>

有时很难看到木头的树木!希望这有助于其他人。