嵌套属性,父级带可选子级

时间:2012-06-15 21:43:59

标签: ruby-on-rails-3 nested-attributes

我有两个模型类,比如父母和孩子。首先创建父母,然后添加一个孩子。

我正在尝试编辑页面,您可以在其中编辑父级的信息并可能添加子级。

我设置它以便父母可以访问子属性:

has_one :child
accepts_nested_attributes_for :child

在我看来编辑父信息时,我有一个显示所有父信息的表单,然后是用于编辑现有子信息或添加新子项的字段:

<%= form_for(@parent, :as => :parent, ...  %>       
    <%= form.text_field(:field_one) %>
    <%= form.text_field(:field_two) %>

    <%= form.fields_for @child do |child| %>  
        <%= child.text_field(:child_field_one) %>
        <%= child.text_field(:child_field_two) %>
    <%end%>
<%end%>

问题是,我能让它工作的唯一方法是让我的父编辑控制器创建一个新的子节点并在渲染视图之前将其与父节点关联。然后,当用户尝试保存时,我的控制器会检查子字段是否为空,如果是,则删除新创建的子字段。这样做的一个问题是,每次加载编辑页面时,它都会创建一个空子(假设子项不存在),然后将其保存到数据库中(我不想要)

是否有一种优雅的方式可以在父编辑页面上显示不存在的子项的字段,而无需在渲染之前创建新的子项?理想情况下,我想要一个单一的形式。我很确定我可以用多个保存按钮以多种形式做到这一点。

2 个答案:

答案 0 :(得分:2)

也许我并不完全理解您要做的事情,但如果您使用的是fields_for标记,则需要一个对象。唯一的另一种方法是使用符号并将其命名为:

<%=form.fields_for :child do |child| %>

但是(假设它甚至在Rails 3中仍然有效)实际上等同于

<%=form.fields_for Child.new do |child| %>

相同
@child = Child.new

在控制器动作中。

我很确定,为了使用表单助手,你需要一个对象来迭代。

答案 1 :(得分:0)

如果您不希望将子对象保存到数据库,除非用户已对其进行了编辑,则一种方法是对子对象进行模型验证,以防止将其保存。