【问题标题】:Nested Attributes, parent with optional child嵌套属性,父级和可选子级
【发布时间】:2012-06-15 21:43:59
【问题描述】:

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

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

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

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

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

是否有一种优雅的方式可以在父编辑页面上显示不存在的子项的字段,而无需在渲染前创建新子项?理想情况下,我希望所有内容都在一个表单上。我很确定我可以想出一种方法来使用多个保存按钮以多种形式执行此操作。

【问题讨论】:

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


    【解决方案1】:

    也许我不完全理解你想要做什么,但如果你使用 fields_for 标签,你需要一个对象。唯一的另一种方法是使用该符号并将其称为:

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

    但是(假设这在 Rails 3 中仍然有效)实际上等效于

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

    相同
    @child = Child.new
    

    在控制器动作中。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        相关资源
        最近更新 更多