嵌套表单rails 4在create上保存现有记录

时间:2017-01-05 22:07:43

标签: ruby-on-rails ruby-on-rails-4 nested-forms

我正在努力让这个工作。我有三个型号

  1. 学生
  2. Classroomattnd
  3. 教室
  4. 使用has_many:through关系。我的所有关系都已正确定义,并且我使用accepts_nested_attributes设置了嵌套表单。

    因此,在创建新学生时,我想从教室列表中进行选择,而不是创建新教室。表单部分工作正常我没有得到的部分是当我创建学生它抱怨以下错误。

    对于ID =

    的学生,无法找到ID = 3的Classrooom

    我现在已经搜索了几天但是无法得到我需要的答案才能使这个工作。

    def new
      @student = Student.new
      @student.classrooms.build
    end
    
    def edit
    end
    
    def create
      @student = Student.new(student_params)
    
      respond_to do |format|
        if @student.save
          format.html { redirect_to @student, notice: 'Student was successfully created.' }
          format.json { render :show, status: :created, location: @student }
        else
          format.html { render :new }
          format.json { render json: @student.errors, status: :unprocessable_entity }
        end
      end
    end
    

    有人可以帮忙,有人必须在此之前面对这个问题吗?

    同样在rails控制台中,当我运行以下代码时,它可以工作:

    classroom = Classroom.last
    student = Student.create(name: 'Dave', classrooms:[classroom])
    

1 个答案:

答案 0 :(得分:0)

您的参数处理不支持嵌套。您可以查看服务器日志中的请求参数,或检查生成的表单的字段名以确保您的目标。

这将是一件好事
def student_params
  params.require(:student).permit(:student => [:name, :classroom => [:id, :name]])
end

或者如下所示。在第二种情况下,我不假设表单中的所有内容都嵌套在学生容器下。另请注意从教室到教室_属性的切换,这是我有时需要进行的更改,即使上面的表单是文档所指示的内容。

def student_params
  params.require(:name).permit(:classroom_attributes => [:id, :name])
end

希望这能为您提供如何根据表单生成的内容定制参数定义的概念。另请注意,您的错误消息可以指示您定义的哪个部分失败,例如您引用的错误中缺少学生ID。