我有三个相互关联的模型类。
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
我该如何解决?
答案 0 :(得分:0)
@student.marks.build
此行将保留一个对象Mark。
如果你想要多个分数,可能需要在新的动作中使用这样的东西:
@group.subjects.each do |subject|
@student.marks.build(:subject=> subject)
end
希望对你有用。