У Rails есть много в отношении принадлежащих

В моем приложении rails у меня есть следующие модели

class Member < ActiveRecord::Base
  has_many :trainings
end

class Student < ActiveRecord::Base
  belongs_to :member
  has_many :trainings   #maybe a through relationship here
end

class Teacher < ActiveRecord::Base
  belongs_to :member
end

###### отредактирован #################

class Training < ActiveRecord::Base
  belongs_to :member  #only member not student nor teacher
end

#############################

Теперь, как я могу построить тренинги в контроллере моего ученика?

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build    #### This is not working
  end
end

Спасибо

2 ответа

Вы должны написать accepts_nested_attributes_for в модели и добавить их в сильные параметры, если вы используете rails 4. Вот так:

class Student < ActiveRecord::Base
  belongs_to :member
  has_many :trainings     
  accepts_nested_attributes_for :trainings
end

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build 
  end

  def create
    @student = Student.create(student_params)
    @student.trainings.build(params[:student][:trainings])

    redirect_to student_path
  end

  #For rails 4

  def student_params
     params.require(:student).permit(:id, :name, trainings_attributes: [ :id, :your fields here ])
    end
end

Вот ссылка, которая поможет вам: Rails 4: accepts_nested_attributes_for и массовое назначение

Если вы правильно определили свои ассоциации, то код в вашем new действие контроллера будет работать (я проверял это). Проверьте и убедитесь, что ваш Training модель существует, или вы использовали правильное имя ассоциации (возможно, вы имели в виду :teachers?).

приложение / модели / student.rb

class Student < ActiveRecord::Base
  has_many :trainings
end

приложение / модели /training.rb

class Training < ActiveRecord::Base
  belongs_to :student
end

приложение / контроллеры /students_controller.rb

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build
  end
end

Обновить:

Предполагая, что именно так определяются ваши ассоциации, вы можете создать экземпляр Training вот так:

приложение / модели / member.rb

class Member < ActiveRecord::Base
  has_many :trainings
end

приложение / модели / student.rb

class Student < ActiveRecord::Base
  delegate :trainings, to: :member
  belongs_to :member
end

приложение / модели /training.rb

class Training < ActiveRecord::Base
  belongs_to :member
end

приложение / контроллеры /students_controller.rb

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.build_member
    @student.trainings.build
  end
end

Надеюсь, это поможет.

Другие вопросы по тегам