【问题标题】:nested form rails 4 save existing record on create嵌套的form rails 4在创建时保存现有记录
【发布时间】:2017-01-05 22:07:43
【问题描述】:

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

  1. 学生
  2. 教室注意
  3. 教室

使用 has_many :through 关系。我的所有关系都已正确定义,并且我已经使用 Accept_nested_attributes 设置了嵌套表单。

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

无法为 ID=3 的学生找到 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])

【问题讨论】:

  • 从那个空白 ID 看,好像您没有获得学生字段。如何定义“student_params”?我希望看到更像 params[:student] 的东西。
  • 学生参数在控制器中定义如下: def student_params params.require(:student).permit(:name, chinese_attributes:[:id, :name ]) end @elc

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


【解决方案1】:

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

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。

【讨论】:

  • 感谢@elc 解决了我的问题,至少我不会再遇到同样的错误了,我会从这里开始处理它。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多