0

В 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 db был бы весьма признателен.

+0

sigh, эти вопросы заданы так много раз ... http://railscasts.com/episodes?utf8=%E2%9C% 93 & search = Рельсы HABTM действительно должны сделать это проще и понятнее! – phoet

+0

это для Rails 3 в 2011 году - вопрос этого вопроса заключается в том, чтобы выяснить наиболее эффективный способ его создания с использованием Rails 4. –

+0

Я думаю, что в этом отношении ничего не изменилось ... – phoet

ответ

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

Смежные вопросы