如何保存belongs_to关系?

时间:2016-05-10 18:19:52

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

我有两个型号

class Course < AR::B
   belongs_to :teacher
end

class Teacher < AR::B
   has_one :course
end

所以我的表courses有一个字段teacher_id。我选择了一个像魅力一样的老师的课程。

但是我想在EDIT TEACHER屏幕上添加一个下拉菜单来改变课程。我试过f.collection_select :course, Courses.all, :id, :name。这将显示下拉列表,并显示在控制器上:

teacher_params[:course] = Course.find(teacher_params[:course])

因为我收到错误Expecting Course got String.如果我只是尝试使用@teacher.save。但这不适用

实现这一目标的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

在您的表单中,确保您正在设置数据库列(而不是关联)

= f.collection_select :course_id, Courses.all, :id, :name
                             ^^^^^

答案 1 :(得分:0)

在编辑页面上,您应该按ID找到该课程,并直接指定teacher_id,或者也可以找到教师模型并将其设置为Course#teacher

假设你的params回来了

之类的东西
{ course: { id: 1, teacher_id: 5 } }

对于选项1,您的控制器可能看起来像

@course = Course.find(teacher_params[:id])
@course.teacher_id = teacher_params[:teacher_id]

或选项2

@course = Course.find(teacher_params[:id])
@teacher = teacher_params[:teacher_id]
@course.teacher = @teacher

现在保存课程应该没问题

答案 2 :(得分:0)

使用:

class Teacher < AR::B
   has_one :courses
end

你正在使用:当然,它必须是复数 第二件事f.collection_select:当然, Courses.all,:id,:name 这是错误的,这是正确的方法

f.collection_select :course, Course.all, :id, :name