Ruby on rails 嵌套表单rails 4在创建时保存现有记录

Ruby on rails 嵌套表单rails 4在创建时保存现有记录,ruby-on-rails,ruby-on-rails-4,nested-forms,Ruby On Rails,Ruby On Rails 4,Nested Forms,我正在努力让它工作。我有三种型号 学生 教室管理员 教室 使用有很多:通过关系。我的所有关系都已正确定义,并且我已使用accepts_nested_属性设置了嵌套表单 因此,在创建新学生时,我希望从教室列表中进行选择,而不是创建新教室。表单部分也可以正常工作。我没有得到的部分是当我创建学生时,它会抱怨以下错误 对于ID为的学生,找不到ID为3的Classrooom= 我已经搜索了几天了,但无法得到我需要的答案,以使这个工作 def new @student = Student.new @

我正在努力让它工作。我有三种型号

  • 学生
  • 教室管理员
  • 教室
  • 使用有很多:通过关系。我的所有关系都已正确定义,并且我已使用accepts_nested_属性设置了嵌套表单

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

    对于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])
    

    您的参数处理不支持嵌套。您可以查看服务器日志中的请求参数,也可以检查生成表单的字段名,以确定目标。这将是一个类似于

    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。

    从该空白id看,似乎您没有获得学生字段。“学生参数”是如何定义的?我希望看到更像params[:student]的东西。在控制器中,student params的定义如下:def student_params params.require(:student).permit(:name,questions_attributes:[:id,:name])end@elcThanks@elc完成了我认为的技巧,至少我不会再收到同样的错误,从现在起我会处理好的。