दिलचस्प पोस्ट
Google मानचित्र मार्कर के लिए ID जोड़ना सी # अनुप्रयोगों के लिए एक अधिष्ठापन प्रोग्राम बनाएं और सेटअप में .NET Framework इंस्टॉलर शामिल करें वर्ड फ़ाइल .doc, docx, .xlsx, .pptx php से पाठ निकालने का तरीका कस्टम एडाप्टर और फिल्टर के साथ स्वत: पूर्णतथाचित्र देखें फ़ाइल सिस्टम 32 के बजाय SysWOW64 में कॉपी हो रही है GetJSON कॉल में त्रुटि संभाल एमएसवीसी में त्रुटि एलएनके2019 जोड़ने, __imp__ उपसर्ग के साथ अनसुलझे प्रतीकों, लेकिन स्थैतिक लिब से होना चाहिए Asp.net mvc कार्रवाई परिणाम ईमेल के अंदर भेजें मैं आईसीएस में निचले भाग में एक्शन बार को कैसे लागू कर सकता हूं? पायथन: एक अर्ध कोलन क्या करता है? VBA से एक कार्यपुस्तिका खोलें और Workbook_Open () कोड अक्षम करें? आप कैसे नेस्टेड डिक्ट पायथन में बना सकते हैं? सी # कोड से Google Geocoding सेवा को कैसे कॉल करें "दर्ज करें" बनाम "पुश ईबीपी; mov ebp, esp; उप esp, imm "और" छोड़ें "बनाम" mov esp, ebp; पॉप ईबीपी " iPhone UITableView – हटाएं बटन

एक एम्बेडेड सरणी का उपयोग करते हुए, मेरे रेल बहु-चयन का पहला तत्व हमेशा रिक्त क्यों होता है?

मैं रेल 3.2.0.rc2 का उपयोग कर रहा हूँ। मुझे एक Model मिल गया है, जिसमें मेरे पास एक स्थैतिक Array जिसे मैं एक प्रपत्र के माध्यम से प्रस्तुत कर रहा हूं जैसे कि उपयोगकर्ता Array सबसेट का चयन कर सकते हैं और अपने चयन को डेटाबेस में सहेज सकते हैं, Model में एक स्तंभ में संग्रहीत कर सकते हैं। मैंने डेटाबेस कॉलम पर सीरियलाइज का उपयोग किया है जो Array संग्रहित करता है और रेल उपयोगकर्ता के चयनों को सही ढंग से यमाल (और उस स्तंभ को पढ़ते समय एक सरणी पर वापस) में कनवर्ट कर रहा है। चयन करने के लिए मैं बहु-चयन फ़ॉर्म इनपुट का उपयोग कर रहा हूं

मेरी समस्या यह है कि, जिस तरह से मुझे वर्तमान में यह है, सब कुछ काम करता है जैसा कि मैं उम्मीद करता हूं सिवाय इसके कि उपयोगकर्ता के सबसेट सरणी के पास हमेशा एक खाली पहला तत्व होता है जब यह सर्वर पर भेजा जाता है

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

MySQL डाटाबेस तालिका 'मॉडल':

  • जिसमें एक subset_array नामक कॉलम शामिल होता है जो एक TEXT फ़ील्ड है

कक्षा मॉडल में निम्नलिखित सेटिंग्स शामिल हैं:

  • serialize :subset_array
  • ALL_POSSIBLE_VALUES = [value1, value2, value3, ...]

मॉडल के संपादन के लिए फ़ॉर्म में निम्न इनपुट विकल्प शामिल हैं:

  • f.select :subset_array, Model::ALL_POSSIBLE_VALUES, {}, :multiple => true, :selected => @model.subset_array

क्लाइंट से सर्वर पर रखो ऐसा कुछ दिखता है:

  • केवल मान मान 1 और मान 3 चयनित हैं
  • "model" => { "subset_array" => ["", value1, value3] }

डेटाबेस अद्यतन इस तरह दिखता है:

  • UPDATE 'models' SET 'subset_array' = '--- \n- \"\"\n- value1\n- value3\n'

जैसा कि आप देख सकते हैं, इस अतिरिक्त, रिक्त, एआरएफ़ में तत्व भेजा जा रहा है और डेटाबेस में सेट किया गया है। मैं इससे कैसे छुटकारा पा रहा हूं? क्या कोई पैरामीटर है जो मुझे मेरे f.select कॉल से याद आ रहा है?

बहुत धन्यवाद की सराहना 🙂

संपादित करें : यह f.selectf.select स्टेटमेंट से उत्पन्न एचटीएमएल कोड है। ऐसा लगता है जैसे कि एक छिपी इनपुट उत्पन्न हो रहा है जो मेरी समस्या का कारण हो सकता है? ऐसा क्यों है?

 <input name="model[subset_array][]" type="hidden" value> <select id="model_subset_array" multiple="multiple" name="model[subset_array][]" selected="selected"> <option value="value1" selected="selected">Value1</option> <option value="value2">Value2</option> <option value="value3" selected="selected">Value3</option> <option...>...</option> </select> 

Solutions Collecting From Web of "एक एम्बेडेड सरणी का उपयोग करते हुए, मेरे रेल बहु-चयन का पहला तत्व हमेशा रिक्त क्यों होता है?"

छिपी हुई फ़ील्ड समस्या का कारण है। लेकिन यह एक अच्छे कारण के लिए है: जब सभी मानों का चयन नहीं किया जाता है, तब भी आपको एक subset_array पैरामीटर प्राप्त होता है। रेल दस्तावेज़ों से (आपको यह सब देखने के लिए दाईं ओर स्क्रॉल करना पड़ सकता है):

  # The HTML specification says when +multiple+ parameter passed to select and all options got deselected # web browsers do not send any value to server. Unfortunately this introduces a gotcha: # if an +User+ model has many +roles+ and have +role_ids+ accessor, and in the form that edits roles of the user # the user deselects all roles from +role_ids+ multiple select box, no +role_ids+ parameter is sent. So, # any mass-assignment idiom like # # @user.update_attributes(params[:user]) # # wouldn't update roles. # # To prevent this the helper generates an auxiliary hidden field before # every multiple select. The hidden field has the same name as multiple select and blank value. # # This way, the client either sends only the hidden field (representing # the deselected multiple select box), or both fields. Since the HTML specification # says key/value pairs have to be sent in the same order they appear in the # form, and parameters extraction gets the last occurrence of any repeated # key in the query string, that works for ordinary forms. 

संपादित करें: अंतिम पैराग्राफ़ से पता चलता है कि जब कुछ चुना जाता है तो आपको खाली एक को नहीं दिखना चाहिए, लेकिन मुझे लगता है कि यह गलत है। जिसने इस रेल को प्रतिबद्ध किया है (देखें https://github.com/rails/rails/commit/faba406fa15251cdc9588364d23c687a14ed6885 ) उसी चाल को करने की कोशिश कर रहा है जो रेल चेकबॉक्स के लिए उपयोग करता है (जैसा कि यहां बताया गया है: https://github.com / रेल / रेल / पुल / 1552 ), लेकिन मुझे नहीं लगता कि यह एक बहुत से चयन बॉक्स के लिए काम कर सकता है क्योंकि पैरामीटर इस मामले में एक सरणी के रूप में भेजे गए हैं और इसलिए कोई भी मान को नजरअंदाज नहीं किया जाता है।

तो मेरी भावना यह है कि यह एक बग है

रेल 4 में:

आप पास करने में सक्षम होंगे :include_hidden विकल्प https://github.com/rails/rails/pull/5414/files

अभी के लिए एक त्वरित सुधार के रूप में: आप अभी अपने मॉडल में उपयोग कर सकते हैं:

 before_validation do |model| model.subset_array.reject!(&:blank?) if model.subset_array end 

यह मॉडल के स्तर पर सभी रिक्त मूल्यों को हटा देगा।

एक और त्वरित सुधार इस नियंत्रक फ़िल्टर का उपयोग करना है:

 def clean_select_multiple_params hash = params hash.each do |k, v| case v when Array then v.reject!(&:blank?) when Hash then clean_select_multiple_params(v) end end end 

मॉडल परत को छूने के बिना इस तरह से नियंत्रकों में फिर से उपयोग किया जा सकता है।

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

पकड़ लिया

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

@ इनवॉइस.अपडेट (पैरामीटर [: चालान]) ध्वज को अपडेट नहीं करेगा

इसे रोकने के लिए हेल्पर बहुत चेक बॉक्स से पहले एक सहायक छुपे हुए क्षेत्र उत्पन्न करता है। छिपे हुए फ़ील्ड का एक ही नाम है और उसके गुण एक अनचेक किए गए चेक बॉक्स की नकल करते हैं।

इस तरह, क्लाइंट या तो केवल छिपी हुई फ़ील्ड भेजता है (चेकबॉक्स का प्रतिनिधित्व करना अनियंत्रित है) या दोनों फ़ील्ड चूंकि एचटीएमएल विनिर्देश कुंजी / मान जोड़े को उसी क्रम में भेजा जाता है, वे फॉर्म में दिखाई देते हैं, और मापदंडों निष्कर्षण क्वेरी स्ट्रिंग में किसी भी दोहराई गई कुंजी की अंतिम उपस्थिति प्राप्त करता है, जो साधारण रूपों के लिए काम करता है।

खाली मूल्यों को हटाने के लिए:

  def myfield=(value) value.reject!(&:blank?) write_attribute(:myfield, value) end 

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

 arr = arr.delete_if { |x| x.empty? } 

मैंने params[:review][:staff_ids].delete("") का उपयोग करके इसे तय किया params[:review][:staff_ids].delete("") नियंत्रक में अपडेट से पहले।

मेरे दृष्टीकोण से:

 = form_for @review do |f| = f.collection_select :staff_ids, @business.staff, :id, :full_name, {}, {multiple:true} = f.submit 'Submit Review' 

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

 class ReviewsController < ApplicationController def create .... params[:review][:staff_ids].delete("") @review.update_attribute(:staff_ids, params[:review][:staff_ids].join(",")) .... end end 

मैं इसे पृष्ठ के जावास्क्रिप्ट भाग में लिखकर काम करता हूं:

 $("#model_subset_array").val( <%= @model.subset_array %> ); 

मेरा निम्नलिखित की तरह दिखता है:

 $("#modela_modelb_ids").val( <%= @modela.modelb_ids %> ); 

मुझे यकीन नहीं है कि भविष्य में मुझे सिरदर्द होने की उम्मीद है लेकिन अब यह ठीक काम करता है।

JQuery का उपयोग करें:

 $('select option:empty').remove(); 

ड्रॉप डाउन से रिक्त विकल्प निकालने का विकल्प।