2016-11-29 127 views
0

我试图保存我的模型,但未能保存它。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:?

回答

0

实际上,您可以创建任意数量的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

+0

我不明白你的回答'''@starship = Starship.new(star_ship_params) @ crew_member.save'''与@starship和@crew_member –

+0

没有关系其实这是我犯的一个错误。我现在纠正了它。 –

+0

谢谢,但你的答案是为了节省星舰,我想同时保存船员和星舰和HolodeckProgram。但是,如何在保存前获取crew_member_id? –