2011-12-09 14 views
8

मैं समझने के लिए "उचित" जिस तरह से एक मॉडल के एकत्रित फ़ील्ड प्रारंभ करने में क्या करना चाहते हैं।उचित तरीका रूपों

मान लीजिए कि आप एक मॉडल के लिए कुछ एकत्रित फ़ील्ड करते हैं:

class User 

    has_one :address 
    accepts_nested_attributes_for :address 
end 

और तुम (इस मामले में address) उन विशेषताओं को प्रारंभ करने के लिए उन्हें एक fields_for कॉल में उपयोग करने के लिए की जरूरत है।

अब तक मैं यह करने के लिए तीन तरीके के बारे में सोचा है।

पहले, मॉडल पर after_initialize हुक:

class User 
    after_initialize :init_address 

    protected 
    def init_address 
    address ||= build_address 
end 

फिर हम नियंत्रक में प्रारंभ है:

class UsersController 
    def new  
    @user = User.new 
    @user.build_address 
    end 
end 

और अंत में, हम हमारे लिए यह करने के लिए एक सहायक विधि हो सकता है:

module FormHelpers 
    def setup_user(user) 
    user.address ||= user.build_address 
    user 
    end 
end 

# view 

<%= form_for setup_user(@user)... %> 

क्या कोई मानक या "सर्वोत्तम अभ्यास" जैसा कुछ भी है परिदृश्य है? आप यह कैसे करते हैं और क्यों?

+0

एक बेहतर समाधान की कमी में, मैं एक मणि है कि इस का ख्याल रखता है लेखन समाप्त हो गया: https://github.com/febuiles/auto_build –

+0

एक पुरानी पोस्ट की तरह लग रहा। आप रेल का किस संस्करण का उपयोग कर रहे हैं? –

उत्तर

0

मेरा मानना ​​है कि पहले से ही build_address, रेल के लिए बनाया गया है के बाद यू एक has_one संघ की घोषणा तो आप urself सा है कि लिखने के लिए जरूरत नहीं है। और यदि फ़ॉर्म को केवल नई क्रिया से ही बुलाया जाता है, तो आपको वास्तव में केवल नियंत्रक बिट की आवश्यकता होती है, और कुछ और नहीं

+0

'build_address' के बजाय कोड में एक टाइपो था, विधि को' init_address 'कहा जाना चाहिए। उम्मीद है कि यह अब स्पष्ट है। –

+0

मैंने सोचा कि यह 'user.addresses.build' था? –

+0

@macek: एक आइटम (has_one संबंध) के लिए आप build_field का उपयोग करते हैं। कई वस्तुओं (has_many) के लिए आप फ़ील्ड्स का उपयोग करते हैं। बिल्ड। –

2

मुझे लगता है कि अगर नेस्टेड विशेषता मूल मॉडल के बिना बिल्कुल समझ में नहीं आती है, तो इमारत और इन घोंसले मॉडल के प्रारंभिक माता-पिता मॉडल की ज़िम्मेदारी होना चाहिए।

मैं क्यों UsersController कैसे @user.addresses बनाया या प्रारंभ कर रहे हैं के बारे में ध्यान देना चाहिए नहीं दिख रहा। मेरे लिए, नियंत्रक इस जिम्मेदारी दे रही है, शायद उस create पर वह एक है कि पार्स और नेस्टेड गुण बनाया (जो, मॉडल में होता है) होना चाहिए मतलब है।

मैं पहली दृष्टिकोण के लिए जाना होगा।

+0

नेस्टेड रूपों के मामले में पहला दृष्टिकोण विफल रहता है। नेस्टेड ऑब्जेक्ट को फिर से शुरू किया जाता है और नेस्टेड फॉर्म सत्यापन विफल हो सकता है। – Bot

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