2013-11-23 22 views
34

मैं अपने नियंत्रक को foo_ids कहने के लिए एसोसिएशन आईडी की एक सरणी भेज रहा हूं। मूल्यों की एक सरणी अनुमति देने के लिए, मैं का उपयोग करें:रेल - खाली सरणी के साथ मजबूत पैरामीटर

params.permit(foo_ids: []) 

अब, समस्या यह है कि अगर मैं foo_ids के एक खाली सरणी भेजने के लिए, पैरामीटर पर ध्यान नहीं दिया जाता है। एक खाली सरणी के रूप में सभी foos को साफ़ करने के बजाय, एसोसिएशन अकेला छोड़ दिया जाता है, क्योंकि foo_ids की अनुमति नहीं है।

ऐसा इसलिए हो सकता है क्योंकि an empty array is converted to nil in rails, और उस शून्य मान को अनदेखा किया गया है क्योंकि मजबूत पैरामीटर स्केलर मानों की एक सरणी की तलाश में हैं, न कि एकल स्केलर मान।

क्या कोई इसे हल करने का एक अच्छा तरीका सुझा सकता है? धन्यवाद!

अतिरिक्त जानकारी

एक अद्यतन नियंत्रक कार्रवाई में, मैं दो मामलों को संभालने में सक्षम होने की जरूरत है। मुझे एक खाली सरणी में foo_ids सेट करने में सक्षम होना चाहिए। अगर मैं केवल एक और फ़ील्ड अपडेट करना चाहता हूं तो मुझे foo_ids को अनदेखा करने में भी सक्षम होना चाहिए। foo_ids को एक खाली सरणी में सेट करना अगर शून्य इस दूसरे मामले के लिए काम नहीं करता है।

उत्तर

18

अस्थायी समाधान मैं करने के लिए नीचे आ गए है:

params[:foo_ids] ||= [] if params.has_key?(:foo_ids) 
params.permit(foo_ids: []) 

यहाँ, foo_ids एक खाली सरणी ही अगर पारित हो जाता है पर सेट है। अगर यह अनुरोध में पारित नहीं किया गया है, तो इसे नजरअंदाज कर दिया जाता है।

मैं अभी भी इस के लिए एक बेहतर समाधान खोजने की उम्मीद कर रहा हूं, क्योंकि इस तरह की चीज उस परियोजना में काफी आम होगी जिस पर मैं काम कर रहा हूं - कृपया यदि आपके पास कोई विचार है तो बेहतर विचार सुझाएं।

+0

पर मैं before_filter जहां मैं सभी कुंजियों कि "_ids" में समाप्त करने के लिए इसके समाधान के लिए कुछ करना चाहते हैं एक बंदर पैच विचार कर रहा था । विचार? – futbolpal

+1

वह काम करेगा। मेरे पास कुछ ऐसे मामले थे जहां मुझे हैश के भीतर घोंसला वाले पैराम्स के लिए ऐसा करने की ज़रूरत थी, ताकि आप अपने उपयोग के आधार पर उनको संभालना चाहें। –

28

यह काफी देर हो चुकी है, लेकिन मुझे बस यह समस्या थी। मैं दोनों अदिश संस्करण और सरणी संस्करण परमिट बयान में है, इसलिए की तरह शामिल करके इसे हल:

params.require(:photo).permit(:tags, tags: []) 

FYI करें - यह है दोनों एक ही परमिट बयान में किया है - अगर आप उन्हें श्रृंखला में यह मिल जाएगा किसी कारण से बाहर फेंक दिया।

संपादित करें: मैंने अभी देखा है कि इस विधि के माध्यम से सबमिट की गई एक खाली सरणी शून्य में बदल दी जाएगी - अब मुझे फ़ील्ड का एक गुच्छा मिला है जो खाली ऐरे होना चाहिए जो शून्य हैं। तो मैंने जो समाधान पोस्ट किया वह वास्तव में मेरे लिए काम नहीं करता है।

दूसरा संपादित करें: सोचा था कि मैंने इसे पहले से ही जोड़ा है, लेकिन यह समस्या पैराम्स हैश पर गहरे_मुंज प्रदर्शन करने वाले रेल से संबंधित है। यह टिप्पणी बताती है कि इसे कैसे ठीक किया जाए: https://stackoverflow.com/a/25428800/130592

0

मुझे हाल ही में एक ही समस्या थी, लेकिन यहां मेरे कोई भी जवाब मेरे लिए काम नहीं करता था। यह मेरा समाधान है। यदि आपके पास जावास्क्रिप्ट हैंडलिंग HTTP अनुरोध हैं, तो यह आपके लिए भी काम कर सकता है।

अपने ग्राहक के पक्ष में:

if (photo.tags.length === 0){ 
    photo.tags = ["null"] 
} 

और अपने PhotosController

def photo_params 
    p = params.require(:photo).permit(tags: []) 
    p["tags"].reject! { |tag| tag == "null" } 
    p 
end 
संबंधित मुद्दे