Rails、Cocoon、嵌套表单未正确保存

Rails, Cocoon, Nested form not saving correctly

您好,我有一个带有 rails 和 cocoon 的嵌套表单。我测试了几个小时的所有内容,并尝试了相关主题中的所有建议,但没有任何效果。这是我的设置:

student.rb(学生模型)

    has_many :parents, dependent: :destroy
    accepts_nested_attributes_for :parents,
                                reject_if: proc { |attributes|    
                                attributes['first_name'].blank? },
                                :allow_destroy => true

students/new.html.erb

  <div class="content <% if !@active_tab %> active <% end %>" id="tabStudent">
    <%= form_for @student, validate: true do |student| %>

      <%= render 'student_fields', model: student %>
      <%= hidden_field(:active, 'tab', value: @active_tab) %>
  </div>

  <div class="content <% if @active_tab === 'tabParents' %> active <% end %>" id="tabParents">
      <h2>Parents</h2>

      <div id="parents">
        <%= student.fields_for :parents do |parent| %>
          <%= render partial: 'parent_fields', locals: {include_mode: 'new', f: parent, added_by: ''}  %>
        <% end %>

      <%= link_to_add_association 'add', student, :parents,
                                   render_options: { locals: {include_mode: 'new', added_by: 'rails'}},
                                  'data-association-insertion-node' => '#parents',
                                  'data-association-insertion-method' => 'append' %>
      </div>

   </div>

students_controller.rb

def create
  @student = Student.new(student_params)
  @student.parents.build

  if @student.save
    flash[:success] = "Success"
    redirect_to @student
  else
    render 'new'
  end
end
private
    def student_params
      params.require(:student).permit(:first_name, :last_name, :gender,
      parents_attributes: [:id, :first_name, :last_name, :gender, :_destroy])
    end

students/_parent_fields.html.erb

<div class="nested-fields">
      <div class="row links">
        <div class="large-12 columns right">
          <%= link_to_remove_association raw('<i style="color:#ff0000;" class="fi-x-circle"></i>'), f %>
       </div>
      </div>



    <div class="row">
      <fieldset>
        <legend>Data</legend>
        <div class="row">
          <div class="large-3 columns field">
            <%= f.label :gender, 'Student Gender' %>
            <%= f.select(:gender, [['male', 'm'], ['female', 'f']]) %>
          </div>

          <div class="large-3 columns field">
            <%= f.label :first_name, 'First Name' %>
            <%= f.text_field :first_name %>
          </div>
          <div class="large-3 columns field">
            <%= f.label :last_name, 'Last Name' %>
            <%= f.text_field :last_name %>
          </div>
      </fieldset>
    </div>
</div>

到目前为止,我可以添加和删除表单域,但是当我发送它时,只有第一个父项被保存到数据库中。如果我使用 "add" link 添加第二个父项,则会将一条空记录保存到数据库中。第二种形式也没有出现在 post 数据中,所以记录为空也就不足为奇了,但我只是想不通为什么数据没有正确传输。

编辑: 我找到了问题所在。我将 curb-foundation 用于 css 样式,对于嵌套形式,我使用它们的 "tabs":

<div class="tabs-content">

  <div class="content <% if !@active_tab %> active <% end %>" id="tabStudent">
<%= form_for @student, validate: true do |student| %>

    <%= render 'student_fields', model: student %>
    <%= hidden_field(:active, 'tab', value: @active_tab) %>


    </div>
    <div class="content <% if @active_tab === 'tabParents' %> active <% end %>" id="tabParents">
      <h2>Parents</h2>

      <div id="parents">
        <%= student.fields_for :parents do |parent| %>
          <%= render partial: 'parent_fields', locals: {include_mode: 'new', f: parent, added_by: ''}  %>
        <% end %>

      <%= link_to_add_association 'new', student, :parents,
                                   render_options: { locals: {include_mode: 'new', added_by: 'rails'}},
                                  'data-association-insertion-node' => '#parents',
                                  'data-association-insertion-method' => 'append' %>
      </div>

    </div>

嵌套的div 似乎破坏了茧的功能。如果我删除它工作的 div。还有人知道如何找到允许我使用制表符的解决方案吗?

谜语已解。由于@student.parents.build,产生了空记录。 Cocoon 不需要这个命令。

主要问题已解决,方法是将 @form_for 部分从第一个基础选项卡中移出一层,使其显示在每个选项卡上方。然后我写了一个小查询函数,只在第一个选项卡中呈现给用户。