Rails在循环中嵌套字段创建

时间:2016-06-21 09:16:48

标签: ruby-on-rails nested-forms

我有三个相互关联的模型类。

 class Student < ActiveRecord::Base

  has_many :marks
  belongs_to :group

  accepts_nested_attributes_for :marks,
                                reject_if: proc { |attributes| attributes['rate'].blank?},
                                allow_destroy: true

end

这个班级描述的学生有很多分数,我想创建学生记录及其分数。

 class Mark < ActiveRecord::Base

  belongs_to :student, dependent: :destroy
  belongs_to :subject

end

标记与主题和学生都有关。

class Subject < ActiveRecord::Base

  belongs_to :group
  has_many :marks

end

当我尝试在循环中创建标记的嵌套字段时,用主题名称标记它们并通过循环传入其subject_id中出现问题 - 只有最后一个嵌套的标记字段被正确保存,而其他字段被忽略。这是我的表单视图代码:

 <%= form_for([@group, @student]) do |f| %>
        <%= f.text_field :student_name %>
        <%=f.label 'Student`s name'%><br>
        <%= f.text_field :student_surname %>
        <%=f.label 'Student`s surname'%><br>
        <%=f.check_box :is_payer%>
        <%=f.label 'Payer'%>
        <%= f.fields_for :marks, @student.marks  do |ff|%>
            <%@group.subjects.each do |subject| %><br>
                <%=ff.label subject.subject_full_name%><br>
                <%=ff.text_field :rate %>
                <%=ff.hidden_field :subject_id, :value => subject.id%><br>
            <%end%>
        <% end %>
        <%= f.submit 'Add student'%>
    <% end %>

这是我的控制器代码:

class StudentsController<ApplicationController

  before_action :authenticate_admin!

  def new
    @student = Student.new
    @student.marks.build
    @group = Group.find(params[:group_id])
    @group.student_sort
  end

  def create
    @group = Group.find(params[:group_id])
    @student = @group.students.new(student_params)
    if @student.save
      redirect_to new_group_student_path
      flash[:notice] = 'Студента успішно додано!'
    else
      redirect_to new_group_student_path
      flash[:alert] = 'При створенні були деякі помилки!'
    end
  end


  private
  def student_params
    params.require(:student).permit(:student_name, :student_surname, :is_payer, marks_attributes: [:id, :rate, :subject_id, :_destroy])
  end
end

我该如何解决?

1 个答案:

答案 0 :(得分:0)

@student.marks.build

此行将保留一个对象Mark。

如果你想要多个分数,可能需要在新的动作中使用这样的东西:

@group.subjects.each do |subject|
   @student.marks.build(:subject=> subject)
end

希望对你有用。