Rails has_many通过保存失败
问题描述:
我试图保存我的模型,但未能保存它。Rails has_many通过保存失败
#starship.rb
class Starship < ApplicationRecord
has_many :crew_members,inverse_of: :starship
accepts_nested_attributes_for :crew_members
has_many :holodeck_programs,inverse_of: :starship
accepts_nested_attributes_for :holodeck_programs
end
#crew_member.rb
class CrewMember < ApplicationRecord
belongs_to :starship
accepts_nested_attributes_for :starship
has_many :holodeck_programs,through: :starship
end
#holodeck_program.rb
class HolodeckProgram < ApplicationRecord
belongs_to :starship
belongs_to :crew_member
end
#controller
def create
#Starship,CrewMember and HolodeckProgram are new via CrewMember.new
@crew_member = CrewMember.new(crew_member_params)
@crew_member.save
.
.
end
.
.
private
def crew_member_params
params.require(:crew_member).permit(:name,:division,:starship_id,
starship_attributes: [:name,:id,
holodeck_programs_attributes: [:title,:starship_id,:crew_member_id]])
end
因为在holodeck_programs_attributes没有crew_member_id,验证错误发生。
我如何处理它在crew_member.rb通过crew_member因为:
我不能使用inverse_of:?
答
实际上,您可以创建任意数量的crew_members,holodeck_programs,同时创建一个星舰。
但你要创建许多飞船,holodeck_programs单个crew_members,看看
def crew_member_params
params.require(:crew_member).permit(:name,:division,:starship_id,
starship_attributes: [:name,:id,
holodeck_programs_attributes: [:title,:starship_id,:crew_member_id]])
end
所以,你需要改变创造,
def create
@starship = Starship.new(star_ship_params)
@starship.save
end
和crew_member_params到
def star_ship_params
params.require(:star_ship).permit(<attributes of star_ship>, holodeck_programs_attributes: [<attributes of holodeck_programs>], crew_members_attributes: [<attributes of crew_members>])
end
还要确保您已完成视图acc中的所有更改ordingly
有关嵌套属性及其用法的更多信息,请查看:NestedAttributes。
我不明白你的回答'''@starship = Starship.new(star_ship_params) @ crew_member.save'''与@starship和@crew_member –
没有关系其实这是我犯的一个错误。我现在纠正了它。 –
谢谢,但你的答案是为了节省星舰,我想同时保存船员和星舰和HolodeckProgram。但是,如何在保存前获取crew_member_id? –