Rails 2.3:当hsing fields_for和:accepts_nested_attributes_for时,如何访问模型的关系

时间:2010-01-14 17:51:46

标签: ruby-on-rails many-to-many

好的,所以关系是:程序有很多:事件 每个事件都属于一个组织者(who_many:events)

在编辑/编辑的表单中,我想列出相关的事件,并且每个条目都可以访问每个管理器,以便我可以执行以下操作:

textfield(event.name)| textfield(event.date)|标签(event.organizer.name)

因此...

<% form_for([:admin, program]) do |f| %>

...

  <h3>Event Data Fields</h3>
    <table>
     <% f.fields_for :events do |event_form| %>
  <tr class="line_item">
    <td><%= event_form.text_field :name %></td>
    <td><%= event_form.text_field :date %></td>
    <td><%= event_form.text_field "organizer.name", :disabled=>true %></td>

  </tr>


      <% end %>
    </table>
    <p><%= f.submit "Submit" %></p>
<% end %>

显然, event_form.text_field“organizer.name”不起作用,但这是概念

3 个答案:

答案 0 :(得分:2)

为什么不直接使用字段?...

<% form_for([:admin, program]) do |f| %>

...

  <h3>Event Data Fields</h3>
  <table>
     <% program.events.each do |event| %>
       <% f.fields_for event do |event_form| %>
  <tr class="line_item">
    <td><%= event_form.text_field :name %></td>
    <td><%= event_form.text_field :date %></td>
    <% event_form.fields_for(:organizer) do |organizer_form| %>
      <td><%= organizer_form.text_field :name, :disabled=>true %></td>
    <% end %>
  </tr>
       <% end %>
     <% end %>
   </table>
   <p><%= f.submit "Submit" %></p>
<% end %>

答案 1 :(得分:0)

只有在一次处理一个对象时,Rails表单助手才有效。如果要同时更新其他记录的属性,则需要对这些字段使用text_field_tag,并在控制器中包含用于解释/保存该数据的自定义逻辑。恕我直言,这远非最佳做法。

替代解决方案包括使用AJAX内联编辑,或者如果想要在编辑时将组织者与事件相关联,则使用选择字段。

但是,如果组织者与您域中的事件密切相关,您希望同时编辑其字段,为什么不在事件对象上使用organizer_name?至少,如果不了解你的对象模型,这将是我的直觉。

答案 2 :(得分:0)

您可以将其作为 halogenandtoast 提及,但如果您只想显示该字段,您也可以这样做:

而不是:

<td><%= event_form.text_field "organizer.name", :disabled=>true %></td>

放:

<td><%= event_form.object.organizer.name %> </td>

object添加到表单构建器时,它将引用已处理的对象,因此您可以访问它的属性。