在表单中混合新的和现有的孩子

时间:2011-06-04 17:04:21

标签: ruby-on-rails forms scope

我正在尝试为我的用户构建一个表单,他们可以为自己输入最多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 %>

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

1 个答案:

答案 0 :(得分:0)

根据我的发现,通过更改传递给fields_for的参数,无法明确更改范围显示新记录的字段。

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

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