रूबी ऑन रेल्स में _snowman परम 3 रूपों के लिए क्या है?


174

रूबी ऑन रेल 3 (वर्तमान में बीटा 4 का उपयोग करते हुए) में, मैं देखता हूं कि form_tagया form_forसहायकों का उपयोग करते समय hidden _snowman( यूनिकोड \ x9731) के मान के साथ एक छुपा हुआ क्षेत्र दिखाई दे रहा है।

तो, यह किस लिए है?


2
यह एक 'प्रलेखन' प्रकार Q & A है - मैंने यहां एक उत्तर खोजने की कोशिश की और प्रतिबद्ध संदेशों के माध्यम से खुदाई को समाप्त किया, इसलिए मुझे लगा कि मैं इसे दूसरों के लिए साझा करूंगा जो स्नोमैन के बारे में सोच रहे हैं ...
मैथ्यू सैवेज

यह भी देखें इस
मास्टरमैटिक

जवाबों:


308

इंटरनेट पैरामीटर (5, 6, 7 और 8) को यूनिकोड के रूप में अपने मापदंडों को एनकोड करने के लिए मजबूर करने के लिए इस पैरामीटर को प्रपत्रों में जोड़ा गया था ।

विशेष रूप से, इस बग को ट्रिगर किया जा सकता है यदि उपयोगकर्ता ब्राउज़र -1 को लैटिन -1 में स्विच करता है। यह समझने के लिए कि कोई उपयोगकर्ता ऐसा क्यों प्रतीत होता है कि वह पागल है, इस Google खोज को देखें । एक बार जब उपयोगकर्ता ने वेब-साइट को लैटिन -1 मोड में डाल दिया है, अगर वे ऐसे पात्रों का उपयोग करते हैं जिन्हें लैटिन -1 और यूनिकोड (उदाहरण के लिए, é या ç, नामों में सामान्य) के रूप में समझा जा सकता है, तो इंटरनेट एक्सप्लोरर उन्हें लैटिन में एनकोड करेगा -1।

इसका मतलब है कि यदि कोई उपयोगकर्ता "च्यू ग्वेरा" खोजता है, तो यह सर्वर-साइड पर गलत तरीके से आएगा। रूबी 1.9 में, यह एक एन्कोडिंग त्रुटि का परिणाम देगा जब पाठ अनिवार्य रूप से नियमित अभिव्यक्ति इंजन में अपना रास्ता बनाता है। रूबी 1.8 में, यह उपयोगकर्ता के लिए टूटे हुए परिणाम देगा।

एक ऐसा पैरामीटर बनाकर जिसे केवल IE द्वारा एक यूनिकोड वर्ण के रूप में समझा जा सकता है, हम IE को स्वीकार-चारसेट विशेषता को देखने के लिए मजबूर कर रहे हैं, जो तब इसे सभी वर्णों को UTF-8 के रूप में एनकोड करने के लिए कहता है, यहां तक ​​कि जिन्हें एनकोड किया जा सकता है लैटिन में -1।

ध्यान रखें कि रूबी 1.8 में, अपने यूटीएफ -8 डेटाबेस में लैटिन -1 डेटा प्राप्त करना बेहद तुच्छ है (चूंकि पूरे स्टैक में कुछ भी नहीं दिखता है कि उपयोगकर्ता किसी भी बिंदु पर भेजे गए बाइट्स वैध यूटीएफ -8 वर्ण हैं)। परिणामस्वरूप, यह उपयोगकर्ता-सामना करने वाले बग को प्रदर्शित करने के लिए रूबी अनुप्रयोगों (और PHP अनुप्रयोगों, आदि) के लिए बेहद आम है और इसलिए उपयोगकर्ताओं के लिए एक उपशामक उपाय के रूप में एन्कोडिंग को बदलने की कोशिश करने के लिए बेहद आम है।

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


1
यदि यह _method जैसे पारदर्शी पैरामीटर को समाप्त करता है, तो यह संभवतः बहुत कम भ्रमित होगा। क्या एक पागल बात तय करने के लिए है, यद्यपि।
tadman

1
विस्तृत प्रतिक्रिया के लिए धन्यवाद येहुदा - हालांकि मुझे लगता है कि स्नोमैन को रखने का सबसे अच्छा परिणाम है, शायद उन बेवकूफ चीजों में से एक 'उद्यम' उठाएगा - 'यह क्या है हिममानव बात?' यह एक व्यवसाय है, एक खेल नहीं है!
मैथ्यू सैवेज

1
@ मैथ्यू, अजीब तरह से आप सही हैं। लेकिन मुझे लगता है कि समाधान बहुत प्रभावशाली है।
जेपी सिल्वाशी

10
स्नोमैन को तब से बदल दिया गया है जिसे utf8 नाम के एक छिपे हुए इनपुट द्वारा "& # x2713" पर सेट किया गया है। मैं अपनी भाषा स्विचर के लिए एक फॉर्म_टैग का उपयोग करता हूं और बहुत सारे अपवाद प्राप्त करना शुरू कर दिया है क्योंकि एक क्रॉलर को इस मान के साथ समस्याएँ दिखाई देती हैं और प्रपत्र में चयन विकल्प के मूल्य के साथ utf8 पैरामीटर और इसके मूल्य को गलत तरीके से समेटता है।
क्रिस्टर फर्स्ट्रोम

56

यह इंटरनेट एक्सप्लोरर 5 का समर्थन करने और इसे यूटीएफ -8 का उपयोग करने के लिए प्रोत्साहित करने के लिए यहां है इसके रूपों के लिए लिए है।

यहाँ देखा गया प्रतिबद्ध संदेश इस प्रकार है:

कई ज्ञात वेब एन्कोडिंग समस्याओं को ठीक करें:

  • सभी रूपों पर स्वीकार-चार्ट को निर्दिष्ट करें। सभी हाल के ब्राउज़रों, साथ ही IE5 +, फॉर्म पैरामीटर के लिए निर्दिष्ट एन्कोडिंग का उपयोग करेंगे
  • दुर्भाग्य से, IE5 + स्वीकार-चारसेट को नहीं देखेगा जब तक कि फॉर्म के मूल्यों में कम से कम एक चरित्र पृष्ठ के चार्ट में नहीं है। चूंकि उपयोगकर्ता डिफ़ॉल्ट
    चारसेट को ओवरराइड कर सकता है (जो रेल यूटीएफ -8 पर सेट होता है), हम एक छिपे हुए इनपुट को एक यूनिकोड वर्ण प्रदान करते हैं, जिससे IE को स्वीकार-चार्ट को देखने के लिए मजबूर किया जाता है।
  • अब जब वेब इनपुट का अधिकांश भाग UTF-8 है, तो हम UTF-8 में इनबाउंड पैरामीटर सेट करते हैं। यह ASCII-8BIT और
    UTF-8 के बीच असंगत एनकोडिंग के कई मामलों को समाप्त कर देगा ।
  • आप सुरक्षित रूप से params [: _ snowman] को अनदेखा कर सकते हैं

संक्षेप में, आप इस पैरामीटर को सुरक्षित रूप से अनदेखा कर सकते हैं।

फिर भी, मुझे यकीन नहीं है कि हम इंटरनेट एक्सप्लोरर 5 जैसी पुरानी तकनीकों का समर्थन क्यों कर रहे हैं। ऐसा लगता है कि अगर आप मुझसे पूछेंगे तो यह रेल के फैसले पर बहुत ही गैर-रूबी की तरह होगा।


7
उद्धरण "IE5 +" कहता है, इसलिए शायद समस्या नए IE संस्करणों में भी होती है?
फिलिप

5
अधिक लंबी प्रतिक्रिया के लिए, कृपया github.com/rails/rails/commit/… पर एक नज़र डालें (साथ ही, नीचे मेरी प्रतिक्रिया देखें)
Yehuda Katz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.