2015-08-11 8 views
7

मैं माता-पिता के कितने पर निर्भर करता हूं, एक बार में 2-4 ऑब्जेक्ट्स के साथ एक फॉर्म सबमिट कर रहा हूं। मुझे एहसास है कि यह शायद अपरंपरागत है, लेकिन मैं वास्तव में चाहता था कि उपयोगकर्ता सभी वस्तुओं को एक ही रूप में संपादित कर सकें। मेरे फ़ॉर्म पर, मैं कर रहा हूँ:कई ऑब्जेक्ट्स और पूर्णांक कुंजियों के साथ रेल 4 मजबूत पैराम

<%= simple_fields_for "derps[]", derp do |f| %> 

<% end %> 

तब मैं नियंत्रक में इस कर रहा हूँ:

def update 
    @derps = [] 
    @rejects = [] 
    derps_params.each do |key, hash| 
    derp = Derp.find(key) 
    derp.assign_attributes(hash) 
    @rejects << derp unless derp.save 
    end 
    if @rejects.empty? 
    redirect_to @parent, flash: {success: 'Derps were successfully updated.'} 
    else 
    @derps = @rejects 
    render :edit 
    end 
end 

कहना चलें कि दो वस्तुओं रहे हैं - पैरामीटर के रूप में के माध्यम से आ रहे हैं:

"derps"=>{"1"=>{"attribute"=>"39", "another_attribute"=>"serp", "a_third_attribute"=>"yerp"}, "2"=>{"attribute"=>"30", "another_attribute"=>"49", }} 

मैंने यह मजबूत पैरा के बिना रेल 3 में काम किया था। मैं रेल के लिए 4 उन्नयन कर रहा हूँ और मैं यह कैसे काम कर पाने के लिए के साथ संघर्ष कर रहा हूँ - मैं हो रही "unpermitted मानकों: 1, 2" रख मुझे लगता है मैं क्या करने की जरूरत संभालने हूँ

कुछ की तरह:

def mashes_params 
    params.require(:derps).permit(
    id: [] 

या

def mashes_params 
    params.require(:derps).permit(
    :id, 

उन पंक्तियों के साथ कुछ, लेकिन मैं इसे हर तरह से मैं भाग्य के बिना सोच सकते हैं की कोशिश की है।

कोई विचार यहाँ है?

+0

क्या mashes_params में 'mashes' हैं? क्या वह 'derps' होना चाहिए? –

+0

हाँ, धन्यवाद! टाइपो कि सही है। वह मेरा असली कोड था।मैं एक सामान्य उदाहरण के रूप में derps का उपयोग कर रहा था। कंसोल के बारे में – gregblass

उत्तर

1

अंतिम संपादित करें (उम्मीद):

जमीन से इस पर पुनर्विचार करने की थी। मैं निष्कर्ष पर आया: चूंकि: आईडी वाइल्डकार्ड के रूप में काम करता है, लेकिन हैश की कुंजी के रूप में अनुमति नहीं है, हमेशा कुंजी को 1-4 क्यों नहीं बनाते हैं, इसलिए मैं उन्हें स्पष्ट रूप से श्वेतसूची में डाल सकता हूं, फिर आईडी को एक कुंजी- हैश में मूल्य, पारंपरिक रूप घोंसले में किया जाता है? यह बताता है कि मैंने इसे कैसे हल किया।

<% i = @parent.derps.index(derp) + 1 %> 
<%= simple_fields_for "derps[#{i}]", derp do |f| %> 
    <%= f.hidden_field :id, value: derp.id %> 
    <%= render "rest_of_the_fields" %> 
<% end %> 

फिर नियंत्रक में:

def update 
    @derps = [] 
    @rejects = [] 
    derp_params.each do |key, hash| 
    derp = Derp.find(hash.delete("id")) 
    derp.assign_attributes(hash) 
    @rejects << derp unless derp.save 
    end 
    if @rejects.empty? 
    redirect_to @parent, flash: {success: "Derps updated successfully."} 
    else 
    @derps = @rejects 
    render :edit 
    end 
end 

फिर यहां मजबूत पैरामीटर हैं:

def derp_params 
    p = [:id, :attribute_1, :another_attribute, ...] 
    params.require(:derps).permit(
    "1" => p, "2" => p, "3" => p, "4" => p 
) 
end 

ओह यहाँ अंतिम कार्यान्वयन है कि मैं काम कर दिया है। उम्मीद है कि यह किसी की मदद करता है।

+1

यह केवल तभी काम करता है जब आप गारंटी दे सकें कि आपके पास 4 से अधिक नेस्टेड रिकॉर्ड नहीं हैं, है ना? तो यह अंतर्निहित समस्या के लिए एक सामान्य उद्देश्य समाधान प्रतीत नहीं होता है। –

4

मैं पाया है कि कमांड लाइन रेल 4 में मजबूत पैरामीटर डीबगिंग के लिए बेहद उपयोगी है यहाँ कैसे मैं कंसोल में अपनी समस्या का परीक्षण किया है:

rails C# From within your project directory, short for 'rails console' 

params = ActionController::Parameters.new({ derps: { 1 => { attribute: 39, another_attribute: "serp" }, 2 => { attribute: 30, another_attribute: 49 } } }) 

params # To make sure that the object looks the same 

permitted = params.require(:derps).permit(1 => [ :attribute, :another_attribute ], 2 => [ :attribute, :another_attribute ]) 

permitted # To see what you'd get back in your controller 

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

+0

ग्रेट टिप! धन्यवाद। – RichardAE

+0

वास्तव में महान टिप आदमी। धन्यवाद! – gregblass

0

पूर्ण सबसे अच्छा समाधान मैंने देखा है here है:

def product_params 
    properties_keys = params[:product].try(:fetch, :properties, {}).keys 
    params.require(:product).permit(:title, :description, properties: properties_keys) 
end 

मैं के बाद से मेरी property_keys अधिक नेस्टेड कुंजी और मूल्यों है अनाम कुंजी के माध्यम से पुनरावृति करने के लिए एक और परिवर्तन किया:

response_keys = params[:survey][:responses].try(:fetch, :properties, {}).keys 
params.require(:survey).permit(responses: response_keys.map {|rk| [rk => [:question_id, :answer_id, :value]]}) 
संबंधित मुद्दे