2010-10-14 12 views
6

बचाने मैं बिल्कुल यकीन है कि क्या मेरी समस्या है नहीं कर रहा हूँ, तो यह सवाल कुछ और स्पष्टीकरण की आवश्यकता हो सकती है, लेकिन यहां जो सबसे अधिक प्रासंगिक नहीं दिखता है: मैं एक has_many :through औररेल 3 has_many: के माध्यम से रिकॉर्ड भूलवश

मॉडल में शामिल होने के कुछ फ़ील्ड हैं जो विदेशी कुंजी नहीं हैं। जब मैं मॉडल तैयार करता हूं और सहेजने का प्रयास करता हूं तो मुझे शामिल मॉडल से गैर-विदेशी कुंजी फ़ील्ड पर सत्यापन त्रुटि मिलती है।

मेरे फ़ाइलें देखने के लिए की तरह:

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

और सटीक त्रुटि है:

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 

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 

पैरामीटर है कि वापस आने के लिए की तरह लग रहे (भूमिका एक स्ट्रिंग है):

ActiveRecord::RecordInvalid in PeopleController#create 
Validation failed: Role can't be blank 

स्पष्ट रूप से सही नहीं है कौन सा है, क्योंकि आप यह params[]

में देख सकते हैं क्या मैं गलत कर रहा हूँ?

यह वह जगह है रेल 3.0.0

+2

मुझे उत्सुकता है कि उन '1. टाइम्स' का उपयोग क्या है? – PeterWong

+0

मैं इसे आसान बनाने के लिए करता हूं अगर मैं इसे 2. बार या बाद में बदलना चाहता हूं। – SooDesuNe

+0

आप सही हैं, ऐसा करने से उपयोगकर्ता को एक बार में 10 विवाह जोड़ने का विकल्प भी मिल सकता है। : डी – PeterWong

उत्तर

0

बदलते "Person.new" से "Person.create" का प्रयास करें, हो सकता है डाटाबेस में रिकॉर्ड बनाने के तुरंत संघों के साथ मदद मिलेगी।

+0

मैं निश्चित रूप से उन्हें डेटाबेस में तुरंत नहीं चाहता हूं। क्या होता है यदि उपयोगकर्ता अपने दिमाग को बदलता है और पृष्ठ से दूर जाता है? अगर मैं 'निर्माण' का उपयोग करता हूं तो क्या मेरे पास खाली रिकॉर्ड नहीं होगा? – SooDesuNe

1

ठीक है, यह, एक अनुमान का एक सा है क्षमा याचना अगर मैं अपना समय बर्बाद कर रहे यहां हवा तो ...

यह अपने बनाने के विधि में की तरह मुझे लग रहा है, तो आप 'शादी' संबंध बना रहे हैं (जो वास्तव में केवल 'नाटक' संबंध है, इसका उपयोग कर रहा है: through =>: wedding_assignments), और फिर इसे वापस कर रहा है। फिर आप इन वस्तुओं को अपने कॉल में व्यक्ति को फिर से बनाने के लिए रेल से पूछ रहे हैं। नया। मेरा अनुमान है कि हैस_मनी के बहुत दूर एक ऑब्जेक्ट बनाने की कोशिश करके रेल उलझन में आ रही है: इंटरमीडिएट ऑब्जेक्ट मौजूद होने के बिना।

मैं इस एक छोटे से पुनर्गठन करने के लिए परीक्षा जाएगा (अपरीक्षित कोड!):

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 

मुझे लगता है यह अंतिम पंक्ति तक काम करेंगे मिल गया है। मुझे लगता है कि आप लेन-देन का उपयोग करने की आवश्यकता हो सकती काम करने के लिए प्राप्त करने के लिए संदेह:

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 

यह सुनिश्चित करना है कि सब कुछ सही क्रम में बनाई गई है और आईडी सही समय आदि दुर्भाग्य से, हालांकि पर उपलब्ध हैं चाहिए, यह थोड़ा अधिक है आपके उदाहरण से जटिल, और इसका मतलब यह है कि आप कई शादियों का समर्थन करने के लिए संघर्ष करेंगे।

आशा है कि इससे मदद मिलती है, और अंधे गली होने से नहीं निकलती है।

+0

अब तक का सबसे अच्छा जवाब है। इस तरह से ऐसा करने का मतलब है कि मैं फॉर्म फ़ील्ड को स्पष्ट रूप से उत्पन्न करने में सक्षम नहीं हूं (यानी: http://railscasts.com/episodes/196-nested-model-form-part-1)। रेल इन संगठनों का प्रबंधन करने में सक्षम होना चाहिए। सप्ताहांत में मैंने व्यक्ति के बजाए शामिल मॉडल, वेडिंगएस्सिमेंटमेंट के साथ शुरू करने और चलाने के लिए कोड को फिर से लिखा, और यह ठीक काम करता है। तो मुझे लगता है कि आप रेल के बारे में सही रास्ते पर हैं ' – SooDesuNe

+0

मेरे पास एक ही समस्या है जिसे मैं इस प्रश्न से हल करने की कोशिश कर रहा हूं, लेकिन मुझे व्यक्ति पर बड़े पैमाने पर सुरक्षा सुरक्षा मिल रही है। कोई विचार? – ctilley79

संबंधित मुद्दे