2010-11-16 13 views
9

मैं एक रेल मणि की तरह एक टुकड़ा का उपयोग करता है:रेल 3.0.2 ऐरे # एचटीएमएल सुरक्षित में शामिल हों?

components = [] 
components << label_for(attribute) 
components << ... 
components << text_field(attribute) 
return components.join 

मणि रेल 3.0.1 में ठीक काम किया, लेकिन यह निकल जाता 3.0.2 रेल के लिए अद्यतन करने के बाद (एक ब्राउज़र में पाठ के रूप में renders) सभी HTML । मैं कुछ गलत क्या कर रहा हूँ? धन्यवाद।

उत्तर

12

के रूप में @ sj26 बताते हैं, या तो का उपयोग रेल में निर्मित सहायक:

<%= safe_join(components) %> 

या मेरी rails_join मणि का उपयोग Array#join एचटीएमएल सुरक्षित जागरूक बनाना, जिस स्थिति में आपका मूल कोड इस तरह काम करेगा।

+0

nb safe_join रेल 3.1 में जोड़ा गया था – robd

1

स्ट्रिंग स्वचालित रूप से HTML- से बच निकले हैं।

return components.join.html_safe 

बारी-बारी से, अगर संपादन मणि बहुत ज्यादा परेशानी आप देखने से यह कर सकते हैं है:

<%= helper_name.html_safe %> 
+0

प्रतिक्रिया के लिए धन्यवाद। रेलवे 3.0.1 में मुझे 'जॉइन' (नए एचटीएमएल-एस्केप का उपयोग करके) में कोई समस्या नहीं थी। किसी भी कारण से यह रेल 3.0.2 में विशेष रूप से विफल रहता है? धन्यवाद। –

+0

मैंने आपकी समस्या का परीक्षण करने के लिए एक सुपर सरल ऐप बनाया है और पाया है कि 3.0.1 मेरे लिए व्यवहार करता है जैसा कि आप कह रहे हैं 3.0.2 करता है। दोनों एचटीएमएल से बचते हैं जब तक कि मैं इसे नहीं कहता (मैंने अपने सहायक में "कच्ची" विधि का उपयोग किया था) – jwarchol

+0

धन्यवाद जेडब्ल्यू और एडम। मैंने अभी एक परीक्षण किया है और आप सही हैं। मुझे यकीन नहीं है कि मेरा मणि पिछले आधा दर्जन संस्करणों के लिए क्यों काम कर रहा था, लेकिन यह मेरी समस्या को ठीक करता है। चीयर्स! –

9

String#join नहीं SafeBuffer -aware है आपको लगता है कि अंतिम पंक्ति को बदलने की जरूरत है।

String#html_safe अंक जो आप स्ट्रिंग करते हैं वह पहले से ही HTML-escaped है, जो उपयोगकर्ताओं को आपके पृष्ठों में HTML के बिट्स को छीनने से रोकता है। this postSafeBuffer पर येहुदा काट्ज़ द्वारा देखें और आपको उनका उपयोग क्यों करना चाहिए।

आप की String और SafeBuffer आप श्रेणीबद्ध करना चाहते हैं एक सरणी है, तो सुनिश्चित करें कि आप उन सब पर #html_safe दौड़े हैं #concat उन्हें एक SafeBuffer इसलिए की तरह बनाना, या:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat 
=> "&lt;one&gt;<p>two</p>" 

रेल एक अंतर्निहित है सहायक में safe_join कहा जाता है जो आपके लिए यह करेगा।

+1

से बचता है यह मेरी राय में बेहतर जवाब है। लगता है कि स्वाभाविक रूप से असुरक्षित लगता है। '.html_safe पर बस एक प्रश्न। क्या यह सिर्फ सरणी में पहली स्ट्रिंग को HTML_safe के रूप में चिह्नित नहीं किया गया है? इसके अलावा, के बीच क्या अंतर है: concat और: concat, उत्तरार्द्ध मेरे लिए समान काम करता है :) –

+2

अधिक सही उत्तर अब ['safe_join (array)'] [http://apidock.com/ रेल/एक्शन व्यू/हेल्पर्स/आउटपुटसाफ्टी हेल्पर/safe_join] जो 'एरे # जॉइन' है जो 'सेफबफर' को समझता है। – sj26

0

मैन्युअल उद्धरण के बारे में कैसे?

<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %> 
संबंधित मुद्दे