2010-01-14 81 views
1

OK,所以关系是:方案有很多:事件 并且每个事件都属于一个组织者(谁HAS_MANY:事件)的Rails 2.3:如何访问模式的关系,当兴fields_for和:accepts_nested_attributes_for

在我想列出相关的事件,并与每个条目,也有权访问每个组织者,所以我可以做这样的事情:

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”将无法​​正常工作,但是这是概念

回答

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 %> 
+0

嗯,这似乎工作,只要我添加一个accept_nested_attributes_for:组织者的事件模型 – Zando 2010-01-14 18:58:31

+0

@Zando:在我的例子中,你不必使用'fields_for'和'accep_nested_attributes_for' :) – klew 2010-01-14 19:16:40

+0

+1:好多了比我的尝试! :) – Veger 2010-01-14 22:34:02

0

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

备用解决方案包括使用AJAX内联编辑,或者如果想法能够在编辑时将组织者与事件相关联以使用选择字段。

但是,如果组织者与您的域中的事件密切相关,以至于您希望同时编辑其字段,为什么不在组织者名称上添加organizer_name?至少,这将是我的直觉,不知道更多关于你的对象模型。 ?

+0

实际上,我只是想显示组织者的名字...不一定更新其属性,我知道这将是一个更复杂的表格 – Zando 2010-01-14 18:05:50

+0

你不需要定制逻辑。现在,当Rails支持嵌套表单时,它可以为您完成整个“自定义逻辑”。你可以在很多层次上嵌套它,并且可以创建非常复杂的表单。当然,在某些情况下,默认方法不起作用,但在大多数情况下它可以工作。 – klew 2010-01-14 18:58:43

0

你可以做到这一点提到halogenandtoast,但如果你想只显示该字段,你也可以做这样的:

相反的:

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

地说:

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

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

相关问题