【问题标题】:Rails, Cocoon, Nested form not saving correctlyRails,Cocoon,嵌套表单未正确保存
【发布时间】:2015-07-15 23:00:42
【问题描述】:

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

student.rb(学生模型)

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

学生/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

学生/_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>

到目前为止,我可以添加和删除表单字段,但是当我发送它时,只有第一个父项保存到数据库中。如果我使用“添加”链接添加第二个父级,则会将空记录保存到数据库中。第二种形式也没有出现在发布数据中,所以记录为空也就不足为奇了,但我就是不知道为什么数据没有正确传输。

编辑:我找到了问题所在。我对 css 样式使用遏制基础,而对于嵌套形式,我使用它们的“选项卡”:

<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 似乎破坏了茧的功能。如果我删除它的工作原理。还有人知道我如何制定一个允许我使用标签的解决方案吗?

【问题讨论】:

    标签: ruby-on-rails nested-forms cocoon-gem


    【解决方案1】:

    谜题解开了。由于@student.parents.build,产生了空记录。 Cocoon 不需要此命令。

    主要问题是通过将@form_for 部分从第一个基础选项卡上移一层来解决的,这样它就会显示在每个选项卡的上方。然后我写了一个小查询函数,只在第一个标签中显示给用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多