2010-02-12 16 views
18

मेरे पास एक उपयोगकर्ता और प्रोफाइल मॉडल है। एक उपयोगकर्ता के पास कई प्रोफाइल हो सकते हैं। उपयोगकर्ता निर्माण प्रक्रिया के दौरान मुझे अपने उपयोगकर्ता मॉडल में प्रोफाइल अनुभाग (जैसे फोन नंबर) से केवल एक ही जानकारी तक पहुंचने की आवश्यकता है। इसलिए मैं attr_accessible के माध्यम से इसे करने की कोशिश कर रहा हूं। मेरा user.rb इस तरह दिखता है।रेल में नेस्टेड फॉर्म - has_many संबंध में विशेषता का उपयोग

has_many :profiles 
attr_accessible :handle, :email, :password, :profile_mobile_number 
attr_accessor : :profile_mobile_number 

समस्या यह है कि मैं का सामना करना पड़ रहा है कि जब मैं (विधि, निजी है, हालांकि मुझे लगता है कि यह कोई बात नहीं) user.rb में एक विधि में गेटर विधि profile_mobile_number कॉल करने के लिए प्रयास करते हैं, मैं है मैं एक शून्य मूल्य प्राप्त कर रहा हूँ। मैं अपने उपयोगकर्ताओं/new.html.erb फॉर्म में निम्नलिखित का उपयोग करता हूं

मेरा प्रश्न यह है कि ऐसा करने का सही तरीका क्या है? क्या मुझे <% f.fields_for :profile do |ff| -%> या <% f.fields_for :profiles do |ff| -%> का उपयोग करना चाहिए (ध्यान दें कि दूसरा एक बहुवचन है)। जब मैं बहुवचन का उपयोग करता हूं: प्रोफ़ाइल, मैं फॉर्म पर फ़ील्ड भी नहीं देखता हूं। मुझे यहां क्या समझ नहीं आ रहा है? और मॉडल उपयोगकर्ता.आरबी में किस तनाव का उपयोग करने की आवश्यकता है? : profile_phone_number या: profiles_phone_number? धन्यवाद।

+0

जैसा कि मैंने कहा था कि मैं f.fields_for का उपयोग कर रहा था: प्रोफाइल और फॉर्म में फ़ील्ड दिखाई नहीं दे रहे थे। यह पता चला है कि मुझे नियंत्रक में @ user.profiles.build जोड़ना था। लेकिन अब मैं user.rb में attr_accessible और accepts_nested_attributes_for दोनों नहीं कर पा रहा हूं। पूर्व उत्तरार्द्ध ओवरराइड करता है। लेकिन मैं प्रोफ़ाइल मॉडल के गुणों तक पहुंच प्रतिबंधित नहीं करते हुए उपयोगकर्ता मॉडल के गुणों के लिए attr_accesible रखना चाहता हूं। कोई विचार? धन्यवाद। –

उत्तर

16

आप की तरह कुछ कर सकता है निम्नलिखित:

<% form_for @user, :url => { :action => "update" } do |user_form| %> 
    ... 
    <% user_form.fields_for :profiles do |profiles_fields| %> 
    Phone Number: <%= profiles_fields.text_field :profile_mobile_number %> 
    <% end %> 
<% end %> 

लेकिन चूंकि आप पहले से ही एक संघ है, तो साथ ही साथ 'accepts_nested_attributes_for' का उपयोग कर सकते

+6

यह उल्लेखनीय है कि यह संबंधित वस्तुओं पर पहले से मौजूद है जो पहले से मौजूद है। हालांकि यह भरने के लिए कोई नया खाली रिकॉर्ड नहीं बनाता है। उस के लिए एक सहायक का उपयोग करें जो कोई नया रिकॉर्ड जोड़ता है यदि कोई भी एसोसिएशन में नहीं है, उदाहरण के लिए "def setup_profiles (उपयोगकर्ता); user.profiles.build अगर user.profiles.blank? ||! User.profiles.map (&: new_record?) .any ?; user; end ", फिर" form_for setup_profiles (@user) का उपयोग करें ... " – hurikhan77

+1

@ hurikhan77 की टिप्पणी महत्वपूर्ण है! यदि कोई संबंधित वस्तु मौजूद नहीं है, तो आपको एक नया ऑब्जेक्ट बनाने की आवश्यकता है, अन्यथा आपके फॉर्म में कुछ भी नहीं दिखता है! – agmin

0

आप उपयोग कर सकते हैं 'accepts_nested_attributes_for' यह करने के लिए;

आप विलक्षण का उपयोग करना चाहिए, और प्रत्येक प्रोफ़ाइल के लिए fields_for कहते हैं, इस तरह::

<% form_for @user do |f| -%> 
<% @user.profiles.each do %> 
<% f.fields_for :profile_attributes, profile do |ff| -%> 
<% end %> 

सूचना है कि है : profile_attributes, बस के बजाय: प्रोफ़ाइल लेकिन रूपों में एक छोटे से चाल नहीं है ।

+3

यदि एक * संबंधित_to polymorphic * एसोसिएशन है, तो आपको अपने उपयोगकर्ता मॉडल में * build_profile * विधि को परिभाषित करना होगा। – nanda

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