2012-08-31 17 views
6

सबमिट करते समय फ़ील्ड को अनदेखा करें मेरे पास वर्तमान में एक ऐसा फॉर्म है जो वाहन बनाता है। वाहन मॉडल शुरू में लगता है कि:फॉर्म

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

आप कोई make_id या model_id कॉलम देखते हैं कि ध्यान दें जाएगा; इनकी आवश्यकता नहीं है, क्योंकि एक ट्रिम एक मॉडल से संबंधित है, और एक मॉडल एक मेक से संबंधित है, इसलिए उन्हें वाहन मॉडल में संग्रहित करने की आवश्यकता नहीं है।

वाहन के रूप में समस्या उत्पन्न होती है - मेरे पास कुछ लिंक किए गए चयन हैं, जहां मैं एक मेक चुन सकता हूं, फिर एक मॉडल, फिर एक ट्रिम कर सकता हूं। जब मैं एक नया वाहन बनाने रहा हूँ, निम्नलिखित कोड ठीक काम करता है:

<%= select("", "", Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select("", "", options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

आप ध्यान देंगे के रूप में, निर्माता और मॉडल चयन प्रपत्र पैरामीटर नहीं है, और इस तरह अनदेखी कर रहे हैं। यह ठीक काम करता है, और वाहन सही ढंग से बचाया जाता है।

कठिनाई तब उत्पन्न होती है जब मैं इस वाहन को संपादित करना चाहता हूं; क्योंकि मेक और मॉडल बस डमी को ट्रिम पर चेन करने का चयन करता है, शुरुआत में वे डिफ़ॉल्ट मान पर सेट होते हैं, न कि वाहन के मेक और मॉडल को संपादित किया जा रहा है। एक परिणाम के रूप में मैं अपने मॉडल की तरह लग रहे करने के लिए अद्यतन किया है:

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
    has_one :model, :through => :trim 
    has_one :make, :through => :model 
end 

और करने के लिए प्रपत्र अद्यतन:

<%= f.select(:make, Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select(:model, options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

लेकिन, जैसा कि उम्मीद होगी, इस Can't mass-assign protected attributes: make, model में परिणाम है, के बाद से निर्माता और मॉडल नहीं हैं attr_accessible (और किसी भी मामले में मेक और मॉडल कॉलम मौजूद नहीं हैं)।

मेरा प्रश्न यह है: क्या कोई नया वाहन फ़ॉर्म सबमिट करते समय इन क्षेत्रों को अनदेखा करने का कोई तरीका है, लेकिन फिर भी जब वाहन संपादित किया जा रहा है तो उन्हें सही मान चुनते हैं?

धन्यवाद!

संपादित करें:

def create 
    @sale = Sale.new 
    current_ability.attributes_for(:new, Sale).each do |key, value| 
     @sale.send("#{key}=", value) 
    end 
    @sale.update_attributes(params[:sale].except("date")) 
    authorize! :create, @sale 
    if @sale.save 
     redirect_to @sale, :notice => "Successfully created sale." 
    else 
     render :action => 'new' 
    end 
end 

आप देखेंगे कि मैं "तिथि" यहाँ सिवाय कोशिश कर रहा हूँ (यह भी कोशिश की है: तारीख) Beerlington से जवाब के अनुसार, मैं अपने create कार्रवाई के रूप में इस अद्यतन किया है - यह एक गैर-नेस्टेड विशेषता के साथ परीक्षण करना था।

मुझे लगता है कि उस तारीख को अभी भी सबमिट किया जा रहा है - क्या कोई भी हैश # का उपयोग कर पूर्ण नियंत्रक कार्रवाई में सहायता कर सकता है?

संपादित करें 2: मैं, सही रूप में Beerlington के जवाब में चिह्नित किया है के रूप में यह मूल प्रश्न का उत्तर दिया - मैं एक अनुवर्ती प्रश्न यहाँ से पूछा है: Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

उत्तर

12

आप कुंजी कि Hash#except का उपयोग करके आवश्यक नहीं हैं हटा सकते हैं :

@vehicle.update_attributes(params[:vehicle].except(:make, :model)) 
+0

धन्यवाद, ऐसा लगता है कि यह काम करेगा - क्या आप एक नेस्टेड विशेषता को छोड़कर कैसे अपडेट कर सकते हैं, उदाहरण के लिए vehicles_attributes"=>{"0"=>{"make"=>""} में बनाओ? धन्यवाद! –

+0

उत्तर के रूप में चिह्नित किया गया है क्योंकि यह मूल प्रश्न का उत्तर देता है और मुझे सही रास्ते पर रखता है। –