如何使用jquery在rails中动态添加嵌套属性

我一直在问这个问题的迭代一段时间了 – 但是在SO社区的帮助下我几乎得到了它的工作。 首先,谢谢!

我有一个表单来创建一个新的student_group并使用Cocoon gem:

  

The name of this group is and it is a/an

There are students in this group.

builder %>

'big_button round unselectable'%>

和’student_fields’部分:

      

现在问题的核心:

我有以下.js文件来动态地向表单添加正确数量的学生字段:

 var row_i = 0; function emptyRow() { row_i++; this.obj = $(""); this.obj.append(''); this.obj.append('select a genderFemaleMaleTransgender'); this.obj.append(' remove student') } function refresh(new_count) { //how many students we have got? console.log("New count= " + new_count); if (new_count > 0) { $('#students_form_table').show(); } else { $('#students_form_table').hide(); } var old_count = parseInt($('tbody').children().length); console.log("Old count= " + old_count); //calculates difference between rows needed/rows current var rows_difference = parseInt(new_count) - old_count; console.log("Rows diff= " + rows_difference); //if we have rows to add if (rows_difference > 0) { for (var i = 0; i < rows_difference; i++) $('tbody').append((new emptyRow()).obj); } else if (rows_difference < 0) //we need to remove rows .. { var index_start = old_count + rows_difference + 1; console.log("Index start= " + index_start); $('tr:gt(' + index_start + ')').remove(); row_i += rows_difference; } } $(document).ready(function () { //hide table by default $('#students_form_table').hide(); $('#nos').change(function () { var opt=$('#nos option:selected'); refresh(opt.text()); }) }); 

因此,这种forms几乎可以正常工作 – 一切都正确格式化,当我选择’x’学生时,’x’学生表格的数量被建立 – 但是,因为这个 –

 function emptyRow() { row_i++; this.obj = $(""); this.obj.append(''); this.obj.append('select a genderFemaleMaleTransgender'); this.obj.append(' remove student') } 

…字段未正确呈现 – 因为它们不会创建新学生字段的谨慎实例。 我知道问题是rails生成的html的id / name部分中的哈希,但是我不知道如何替换它以便这样做。 我最接近的是试图改变这个网站的咖啡因 ,但我无法让它发挥作用。

那么如何使用jquery为模型动态生成新表单?

编辑 :实际上我刚刚意识到第一个和最后一个表格将正确保存 – 也就是说,如果我添加八个学生,student1和student8将被输入数据库,但其他人不会。 这只会让我更加困惑:/

编辑2 :我发现这个 jquery api在这个问题的上下文中被称为’序列化’,我认为它可能是我需要的,但是无法适应它。 帮我!

得到它了!

尝试了很多东西,但这最终有效:

student_groups_controller.rb #create

 def create @params = params[:student_group][:students_attributes] @student_group = @user.student_groups.build(params[:student_group]) if @student_group.save ### RE: 'defensive coding' http://stackoverflow.com/questions/14502508/undefined-method-for-nilnilclass-when-pushing-values-to-an-array if @params.present? ### http://stackoverflow.com/questions/11355820/rails-3-2-iterate-through-an-array @params.each do |student| @student_group.students.create(name:"#{student[:name]}", gender: "#{student[:gender]}") end end # new subject path redirect_to class_path(@student_group), flash: { success: "#{@student_group.name} has been added successfully" } else @title = "Create a new group" flash.now[:error] = "Something's gone wrong. Please try again!" render 'new' end end 

_groups_form.html.rb相关部分

  <%= fields_for 'student_group[students_attributes][]', @student, index: nil do |builder| %> <%= render "student_fields", :f => builder %> <% end %> 

最后, student_groups.js的相关部分:

 function emptyRow() { row_i++; this.obj = $(""); this.obj.append(''); this.obj.append(''); this.obj.append('remove student') }