创建一个向连接表添加新行的表单

时间:2014-02-08 01:14:13

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord has-and-belongs-to-many

在Rails 4中,如何在has_many中通过关联创建一个在连接表中创建新行的表单?具体来说,我将什么传递给我的check_box()输入?

实施例: 学生报名参加许多课程。这是has_many到has_many的关联。我的联接表是“student_course_assignments”。

型号:

Student
has_many :student_course_assignments
has_many :courses, through: :student_course_assignments
accepts_nested_attributes_for :student_course_assignments

Course
has_many :student_course_assignments
has_many :students, through: :student_course_assignments

StudentCourseAssignment
belongs_to :student
belongs_to :course

控制学生

def show
  @student.student_course_assignments.build
end

myapp.com/student/1

查看
# This form lets you add new rows to student_course_assignments, for the given student.
<%= form_for @student do |f| %>
  <%= f.fields_for :student_course_assignments do |join_fields| %>
    <% Courses.all.each do |course| %>
      <%= join_fields.checkbox(course.id) %>  # What should be passed in here??
      <span><%= course.name %></span>
    <% end %>
  <% end %>
<% end %>

关于如何构建显示每个课程复选框的表单的任何建议,并让我检查应该添加到student_course_assignemnts数据库的课程将不胜感激。

1 个答案:

答案 0 :(得分:0)

<强> ActiveRecord的

您可能正在寻找<< ActiveRecord功能:

#config/routes.rb
resources :students do
    #could be a member route
    match :add, via: [:get, :post]
end

#app/controller/students_controller.rb
def add
    @student = Student.find(params[:student_id])
    if request.post?
        @course = Course.find(params[:course_id])
        @student.student_course_assignments << @course
    end
end

#app/views/students/add.html.erb
<%= form_for @student, method: :post do |f| %>
    <%= f.text_field :course_id %>
<% end %>

<强>此致

对于你的代码,我会这样做:

<%= form_for @student do |f| %>
    <% Courses.all.each do |course| %>
      <%= f.checkbox :student_course_assignment_ids, course.id %>
      <span><%= course.name %></span>
  <% end %>
<% end %>

我认为这将填充:student_course_assignments的集合。如果您没有创建新的accepts_nested_attributes_for对象

,则不必使用course