2011-06-04 34 views
0

我想为我的用户创建一个表单,他们可以为自己输入3个地址。创建地址后,它可以被标记为非活动状态,不会计入3.我的用户模型中使用的是accepts_nested_attributes_for :addresses,我在表单中尝试了一些东西,但无法显示fields_for现有地址和新地址的范围。在窗体中混合新的和现有的孩子

这些有几件事情我已经试过:

在控制器:
(3 - @user.addresses.active.count).times { @user.addresses.build }

这给了我所有现有的,积极的地址,但没有新的:

<%= f.fields_for :addresses, @user.addresses.active do |address| %> 
    <%= address.text_field :line_1 %> 
<% end %> 

这给我现有的和新的地址,但它包括不活动的地址:

<%= f.fields_for :addresses do |address| %> 
    <%= address.text_field :line_1 %> 
<% end %> 

有没有办法将这些组合起来以获得新的范围记录?

回答

0

从我发现,不可能通过更改传递给fields_for的参数明确地更改范围显示新记录的字段。

但最终解决我的问题的是,当将符号传递给fields_for(例如:fields_for :addresses)时,将使用该模型的默认范围。所以我在我的地址型号上设置了default_scope where(:status => 'active'),现在fields_for将只显示有效地址的字段新地址的字段。

我还需要按照创建日期排序这些地址。这可以通过更改用户模型中has_many :addresses关系的默认排序来实现。因此,虽然似乎没有办法明确说明在fields_for的参数中使用哪些范围,但还是有其他方法的。如果任何人都可以解释如何做到这一点,我会很乐意将该答案标记为正确的。