2010-12-13 51 views
3

我想为fields_for使用额外的集合。这个集合应该在fields_for中使用所有的可能性。rails:fields_for和collection

可以说我有一个人在同一天每周定期发生的任务。在人形式中,即使没有任何已保存的任务,我也应该每天都有条目。我试过了:

<% form_for(@person) do |f| %> 
... 

    <% f.fields_for :tasks, @weekdays do |task_fields| %> 
    <%= weekday.name %>: 
    <%= project_fields.text_field :name %> 
    <% end %> 
<% end %> 

现在应该为每个工作日一个文本字段输入当天的任务名称。例如weekday.name =“monday”和task.name =“喝咖啡”,task.weekday_id = 1

+0

不知道你在问什么。你是否遇到了一些你不明白的错误?如果你问如何实现某些东西,也许你可以更具体或者提供一些解释。 – Samo 2010-12-13 17:22:17

+0

您是否实际上使用默认的,开始的数据填充了@weekdays? – 2011-02-15 15:51:15

+0

有两件事情,一个'weekday'看起来不像它有价值,你可以使用'task_fields.object.name',两个我认为文档是错误的,你不能将一个集合作为第二个参数传递给' fields_for'。调查... – Kris 2012-08-02 10:44:19

回答

0

您不是遍历week_days。你应该这样做:

<% @weekdays.each_with_index do |weekday, i| %> 
    <% f.fields_for :tasks do |task_fields| %> 
    <%= weekday.name %>: 
    <%= task_fields.text_field :name %> 
    <%= task_fields.hidden_field :weekday_id, :value => (i + 1) %> 
    <% end %> 
<% end %> 

如果你有一个表,“工作日”,然后hidden_​​field值应为weekday.id

编辑:7月30日

我觉得我完全搞砸了这个答案。让我试着改进它。

<% f.fields_for :tasks, @weekdays do |task_fields| %> 
    <%= weekday = task_fields.object %> 
    <%= weekday.name %>: 
    <%= task_fields.text_field :name %> 
    <%= task_fields.hidden_field :weekday_id, :value => weekday.id %> 
<% end %> 
+15

请注意,根据文档,应该可以指定一个集合作为OP正在尝试执行的'fields_for'的第二个参数。根据我的经验,这似乎被打破了。尝试使用像'foo_fields.text_field:name'这样的助手会导致一个异常,例如'' – 2011-06-19 06:02:16

+0

稍微不正确。 A)正如上面提到的,rails支持第二个参数,它定义了要迭代的集合,B)更重要的是,使用这个参数可以确保在使用表单元素时,每个子对象的id属性都会生成HTML属性名称单选按钮等(例如'person [tasks] [1] [:field_name]')。 还有最后一件事,与这个问题没有直接关系,但相关。确保在父模型中包含'accep_nested_attributes_for:'。否则,它不会以一种明显的方式失败,但你将被留在你的头发外面。 – user2490003 2017-07-25 23:38:01

+0

说实话,我认为我完全错过了这个答案中的问题的重点,并且是非常错误的:D – rubyprince 2017-07-27 06:56:54