2011-02-01 14 views
5

क्या कोई मुझे रेल 3 में नेस्टेड विशेषताओं के माध्यम से चल सकता है?रेल में नेस्टेड गुण 3

मैं दो मॉडल है: प्रमाण पत्र और अभिरक्षक, इस प्रकार से संबंधित:

प्रमाणपत्र मॉडल:

class Certificate < ActiveRecord::Base 
    belongs_to :shareholder 
    belongs_to :custodian 
    belongs_to :issuer 

    accepts_nested_attributes_for :custodian, :shareholder, :issuer 
end 

प्रमाणपत्र नियंत्रक:

class CertificateController < ApplicationController 
    def issue 
    @certificate = Certificate.new 
    @certificate.custodian.build 
    end 
end 

मेरे दृश्य:

<% form_for(:certificate, :url => {:action => 'testing'}) do |f| -%> 

<div id="error"> 
    <%= f.error_messages %> 
</div> 

    <%= f.label :number, "Certificate Number" %> 
    <%= f.text_field :number %> <br/> 

    <%= f.label :num_of_shares, "Number Of Shares" %> 
    <%= f.text_field :num_of_shares %> <br/> 

    <% f.fields_for :custodian do |custodian| -%> 
     <%= custodian.label :name, "Custodian Name" %> 
     <%= custodian.text_field :name %> 
    <% end -%> 

    <%= f.submit "Issue Certificate", :disable_with => 'Working....' %> 

<% end -%> 

अब, लाइन 4 पर किसी कारण, मेरे नियंत्रक में के लिए: @certificate.custodian.build

मैं इस त्रुटि हो रही है: undefined method 'build' for nil:NilClass

किसी भी एक कृपया मदद कर सकते हैं?

उत्तर

7

accepts_nested_attributes_for एक-से-अनेक संबंध में एक के पक्ष में जाना चाहिए।

class Custodian < ActiveRecord::Base 
    has_many :certificates 
    accepts_nested_attributes_for :certificates 
end 

तो, आपके विचार में, कोई फ़ील्ड_for नहीं होना चाहिए: संरक्षक, यह गलत पक्ष पर है। यदि आपको उस दृश्य से प्रमाण पत्र बनाना है, तो आपको शायद एक चयन बॉक्स में उपलब्ध custodians सूचीबद्ध करना होगा।

+0

धन्यवाद 'पेजिक' वही है जो मैं प्राप्त करने की कोशिश कर रहा हूं। लेकिन एक चयन बॉक्स के बजाय, मैं एक स्वत: पूर्ण क्षेत्र बनाने के लिए अजाक्स का उपयोग करने की योजना बना रहा हूं। लेकिन अभी के लिए, मुझे यह वर्णन करने में दिलचस्पी है कि आपने जिस तरीके से वर्णन किया है। –

+0

मैं सूचीबद्ध कस्टोडियन के साथ एक नया इंस्टेंस वैरिएबल बना सकता हूं और एक चयन बॉक्स प्रदर्शित कर सकता हूं, लेकिन फिर मैं मॉडल में एसोसिएशन को कैसे सहेज सकता हूं? –

+0

आईडी/नाम विकल्प जोड़े के साथ चयन बॉक्स को पॉप्युलेट करें। यह कैसे करना है इसके बारे में एक अच्छी मार्गदर्शिका यहां दी गई है, http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease यह आपके मूल रूप को ऊपर और चलाना चाहिए। स्वत: पूर्ण करने के लिए, आपको JSON बनाने की आवश्यकता है ताकि यह कस्टोडियन नियंत्रक के लिए अद्वितीय कुछ हो, जैसे आईडी या नाम अद्वितीय हो। –

9
एक belongs_to साथ

, यह होना चाहिए

@certificate.build_custodian 
+1

धन्यवाद 'guitsaru' कि काम किया। लेकिन, मेरा विचार 'field_for' भाग को बिल्कुल प्रस्तुत नहीं कर रहा है। बाकी का फॉर्म ठीक से प्रस्तुत किया जा रहा है। –

6

इस लाइन

<% f.fields_for :custodian do |custodian| -%> 

होना चाहिए

<%= f.fields_for :custodian do |custodian| -%> 
संबंधित मुद्दे