У 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
Надеюсь, это поможет.