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
部分从第一个基础选项卡中移出一层,使其显示在每个选项卡上方。然后我写了一个小查询函数,只在第一个选项卡中呈现给用户。
您好,我有一个带有 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
部分从第一个基础选项卡中移出一层,使其显示在每个选项卡上方。然后我写了一个小查询函数,只在第一个选项卡中呈现给用户。