2016-11-29 5 views
0

私のモデルを保存しようとしましたが、保存できませんでした。Rails has_many from save fail

#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はありませんので、検証エラーが起こります。

私はinverse_of使用することはできません:私はそれを処理することができますどのようにcrew_member.rb

であるための貫通crew_member:?

答えて

0

実際には、宇宙船の作成中に任意の数のcrew_members、holodeck_programsを作成できます。

しかし、あなたは、多くの宇宙船を作成しようとしている、単一crew_membersためholodeck_programs、

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 

また、ビューのすべての変更が完了していることを確認してくださいordingly

ネストされた属性とその使用法の詳細については、NestedAttributesを参照してください。私はあなたの答えを理解していない

+0

'' '@starship = Starship.new(star_ship_params) crew_member.save''' @ @starshipと@crew_member –

+0

とは関係実際に私によって作られた間違いのthatsはありません。私は今それを修正しました。 –

+0

ありがとう、あなたの答えは宇宙船を保存することです、私はcrew_memberと宇宙船とHolodeckProgramを同時に保存したいです。ただし、保存する前にcrew_member_idを取得する方法はありますか? –