2010-10-14 42 views
6

tasarruf yoluyla benim sorunun ne olduğundan emin değilim, bu nedenle bu soru biraz daha fazla açıklama gerektirebilir, ama burada en alakalı gibi görünüyor budur: Bir has_many :through ve sahipraylar 3 Has_many: rekor hatası

katıl modelinde yabancı anahtar olmayan bazı alanlar bulunur. Modelleri kurduğumda ve kaydetmeyi denediğimde, katılma modelindeki yabancı olmayan anahtar alanlarında bir doğrulama hatası alıyorum.

{"first_name"=>"", "last_name"=>"", "weddings_attributes"=>{"0"=>{"wedding_assignments_attributes"=>{"0"=>{"role"=>"Bride's Maid", "budget"=>""}}, "date"=>"", "ceremony_notes"=>""}}} 

Ve tam hatadır:

Person.rb 

    has_many :wedding_assignments, :dependent => :destroy 
    has_many :weddings, :through=>:wedding_assignments 
    accepts_nested_attributes_for :weddings 
    accepts_nested_attributes_for :wedding_assignments 

Wedding.rb 

    has_many :wedding_assignments, :dependent => :destroy 
    has_many :people, :through=>:wedding_assignments 
    accepts_nested_attributes_for :people 
    accepts_nested_attributes_for :wedding_assignments 

WeddingAssignment.rb 

    belongs_to :person 
    belongs_to :wedding 
    validates_presence_of :role, :person, :wedding 

gel benziyor

people_controller.rb 

    def new 
    @person = Person.new 

    1.times do 
     wedding = @person.weddings.build 
     1.times do 
     assignment = wedding.wedding_assignments.build 
     assignment.person = @person 
     assignment.wedding = wedding 
     end 
    end 
    end 

    def create 
    @person = Person.new(params[:person]) 
    @person.weddings.each do |wedding| 
     wedding.wedding_assignments.each do |assignment| 
     assignment.person = @person #i don't think I should need to set person and wedding manually, but I get a validation error if I don't 
     assignment.wedding = wedding 
     end 
    end 
end 

parametreler (rolü bir dize):

Dosyalarım benziyor:

ActiveRecord::RecordInvalid in PeopleController#create 
Validation failed: Role can't be blank 
Eğer yanlış yapıyorum params[]

görebiliyorum beri açıkça doğru değildir

?

budur 3.0.0

+2

Bu '1 kez' kullanımının ne olduğunu merak ediyorum? – PeterWong

+0

Bunu 2 ya da daha fazla süre değiştirmek isterseniz bunu kolaylaştırmak için yapıyorum. – SooDesuNe

+0

Haklısınız, bunu yapmak bile kullanıcının tek seferde 10 düğün eklemeyi seçmesine izin verebilir. : D – PeterWong

cevap

0

belki derneklerle yardımcı olacaktır hemen db kaydı oluşturduktan, için "Person.create" "Person.new" değiştirmeyi deneyin raylar.

Bu sizin oluşturmak yöntemde gibi görünüyor bana ... Ben burada vakit kadar rüzgar varsa özür böylece

+0

Kesinlikle onları veritabanında istemiyorum. Kullanıcı fikrini değiştirir ve sayfadan ayrılırsa ne olur? 'Create' kullanırsam boş bir kayıt olmaz mı? – SooDesuNe

1

Sağ, bu, bir tahmin biraz, sen 'düğün' ilişki oluştururken (ki bu sadece 'taklit' bir ilişkidir, gerçekten kullanıyor: şu şekilde: = =:: wedding_assignments), ve sonra bunu döndürüyor. Ardından, bu nesneleri yeniden çağırmak için rayları sorarsınız. Benim tahminim, raylar, bir has_many'ın uzak tarafında bir nesne yaratmaya çalışmakla karışıyor: ara nesne bulunmadan.

bu biraz yeniden yapılandırmak için cazip olacağını (denenmemiş kodu!): Bu son satırına kadar çalışacağız bir his var

def new 
    @person = Person.new 
    @wedding = Wedding.new 
    @wedding_assignment = WeddingAssignment.new 
end 

def create 
    @person = Person.new(params[:person]) 
    @wedding = Wedding.new(params[:person]) 
    @assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person})) 
end 

. Sanırım bu hareketleri kullanmak gerekebilir işe gitmek için şüpheli: Bu her şeyin doğru sırayla oluşturulur ve kimlikleri Maalesef olsa vb doğru zamanlarda sunulmasını sağlarlar gerektiğini

def create 
    @person = Person.new(params[:person]) 
    @wedding = Wedding.new(params[:person]) 
    ActiveRecord::Base.transaction do 
    if @person.valid? && @wedding.valid? 
     [@person,@wedding].each.save! 
     @assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person})) 
     @assignment.save! 
    end 
    end 
end 

, biraz daha var örneğinizden daha karmaşık ve birden çok düğünleri desteklemek için mücadele edeceğiniz anlamına geliyor.

Bu yardımcı olur umarım, ve kör bir sokak olmuyor.

+0

Henüz en iyi cevap. Bu şekilde yapmak, form alanlarını temiz bir şekilde oluşturamayacağım anlamına gelir (örneğin: http://railscasts.com/episodes/196-nested-model-form-part-1). Raylar bu ilişkileri yönetebilmelidir. Hafta sonu boyunca, Code of Person'le birleştirme modeli, WeddingAssignment ile başlayan ve çalışmaya başladığım kodu yazdım ve gayet iyi çalışıyor. Bu yüzden sanırım rayların kafasını karıştırmak için doğru yoldasınız ' – SooDesuNe

+0

Bu soruya çözüm bulmaya çalıştığım benzer bir sorun var, ama şahsen bir yığın güvenlik hatası alıyorum. Herhangi bir fikir? – ctilley79