रूबी ऑन रेल्स: HTML के रूप में एक स्ट्रिंग कैसे रेंडर करें?


154

मेरे पास है

@str = "<b>Hi</b>"

और मेरे एरब दृश्य में:

<%= @str %>

पृष्ठ पर क्या प्रदर्शित होगा: <b>Hi</b>जब मैं वास्तव में चाहता हूं कि हाय । HTML मार्कअप के रूप में एक स्ट्रिंग को "व्याख्या" करने के लिए माणिक तरीका क्या है?


संपादित करें : मामला जहां

@str = "<span class=\"classname\">hello</span>"

अगर मेरे विचार में मैं करता हूँ

<%raw @str %>

HTML स्रोत कोड है <span class=\"classname\">hello</span> जहां मैं वास्तव में चाहता हूं <span class="classname">hello</span>(बैकस्लैश के बिना जो दोहरे उद्धरणों से बच रहे थे)। उन दोहरे उद्धरण चिह्नों को "अनसेस्केप" करने का सबसे अच्छा तरीका क्या है?


आप स्ट्रिंग से बचने के लिए% Q [] सिंटैक्स का उपयोग करने पर भी विचार कर सकते हैं। उदा। %Q["quotation marks"] => "\"quotation marks\"" स्रोत: en.wikibooks.org/wiki/Ruby_Programming/Syntax/… पता नहीं कि क्या मदद करता है।
0112

जवाबों:


328

अपडेट करें

सुरक्षा कारणों से, इसके sanitizeबजाय उपयोग करने की अनुशंसा की जाती है html_safeसंपर्क


क्या हो रहा है कि, एक सुरक्षा उपाय के रूप में, रेल आपके लिए अपने तार से बच रही है क्योंकि इसमें दुर्भावनापूर्ण कोड हो सकता है। लेकिन अगर आप रेल को बताते हैं कि आपका तार है html_safe, तो वह सही से गुजर जाएगा।

@str = "<b>Hi</b>".html_safe
<%= @str %>

या

@str = "<b>Hi</b>"
<%= @str.html_safe %>

rawकाम का उपयोग ठीक है, लेकिन यह सब कर रहा है स्ट्रिंग को एक स्ट्रिंग में परिवर्तित कर रहा है, और फिर html_safe को कॉल कर रहा है। जब मुझे पता है कि मेरे पास एक स्ट्रिंग है, तो मैं सीधे html_safe को कॉल करना पसंद करता हूं, क्योंकि यह एक अनावश्यक कदम को छोड़ देता है और यह स्पष्ट करता है कि क्या चल रहा है। स्ट्रिंग- एस्केपिंग और XSS संरक्षण के बारे में विवरण इस Asciicast में हैं


बहुत खुबस। एक घंटे तक खोज करने के बाद भी मैं ऐसा नहीं कर पाया। आपके उत्तर के लिए धन्यवाद।
सलिल

1
मैंने हमेशा उपयोग किया है raw। इस बारे में जानकर बहुत खुशी हुई!
jmcharnes

भविष्य से लटकता हुआ =)
कार्लोस मोरेल्स


16

कच्चे का उपयोग करें :

<%=raw @str >

लेकिन जैसा कि @ jmort253 सही ढंग से कहता है, विचार करें कि HTML वास्तव में कहां है।


नमस्ते, यह समाधान काम करता है, एक चेतावनी के अलावा: कृपया संपादित प्रश्न देखें
टिम

14

यदि आप एरुबिसrails का उपयोग कर रहे हैं, तो यह करने का सबसे अच्छा तरीका है

<%== @str >

डबल बराबर चिह्न पर ध्यान दें। अधिक जानकारी के लिए SO पर संबंधित प्रश्न देखें



7

आप अपने व्यापार तर्क को अपनी सामग्री के साथ मिला रहे हैं। इसके बजाय, मैं डेटा को आपके पृष्ठ पर भेजने की सलाह दूंगा और फिर JQuery जैसी किसी चीज़ का उपयोग करके उस डेटा को रखूँगा जहाँ आपको जाने की आवश्यकता है।

यह आपके सभी HTML को उन HTML पृष्ठों में रखने का लाभ देता है, जहाँ यह ऐसा होता है कि आपके वेब डिज़ाइनर बाद में HTML को संशोधित कर सकते हैं, बिना क्लाइंट कोड के माध्यम से।

या यदि आप जावास्क्रिप्ट का उपयोग नहीं करना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

@str = "Hi"

<b><%= @str ></b>

कम से कम इस तरह से आपका HTML HTML पेज में है जहाँ वह है।


समस्या यह है, मेरा ऐप एक ऐसी फ़ाइल में ले रहा है जिसे खराब तरीके से चिह्नित किया गया है, और दृश्य में भेजने के लिए इसे रीजेक्स के माध्यम से अच्छे HTML मार्कअप में "अनुवाद" कर रहा है। इसलिए, उत्पन्न होने वाला HTML मार्कअप डायनेमिक है, इसलिए मैं एक प्राथमिकता नहीं जान सकता कि कौन से टैग्स @ को घेरने वाले हैं। मैं यह "अनुवाद" कार्य कहां करूंगा, यदि मॉडलों में नहीं? मुझे लगता है कि हम विचारों में व्यापक तर्क कोड के लिए नहीं थे।
टिम

1
यह वास्तव में एक राय की बात है। एक ताजा ऐप विकसित करते समय मैं हर चीज को यथासंभव साफ रखना पसंद करता हूं। लेकिन अक्सर दूसरों के साथ हमें छोड़ दिया है की बाधाओं के भीतर काम करना चाहिए। यदि आपका डेटा स्रोत HTML मार्कअप देता है, तो शायद माइकल स्टम के समाधान में वर्णित "कच्चे" का उपयोग करने पर एक नज़र डालें।
jmort253

1
यदि आपको कुछ कोड का समर्थन विरासत में मिला है, और कोड में ऐसे क्षेत्र हैं जो खराब सोच या डिजाइन दिखाते हैं, तो यह वास्तव में आपकी जिम्मेदारी है कि इसे अधिक रखरखाव योग्य बनाने के लिए इसे साफ करना। इसे छोड़ते हुए जैसा कि आपने पाया कि यह तब ठीक है जब इसे शुरू करने के लिए बढ़िया कोड है, लेकिन इसे छोड़ने से बेहतर है कि आपने इसे तब प्राप्त किया जब यह आवश्यक हो। मेरी नौकरी का हिस्सा कुछ विरासत ऐप का प्रबंधन कर रहा है; मैं उन चीजों को ठीक नहीं करने का प्रशंसक हूं जो टूटी नहीं हैं, लेकिन उन्हें आसानी से नहीं बढ़ाया जा सकता है क्योंकि वे कैसे लिखे गए थे। मुझे ज्यादातर फंक्शन कॉल्स को फिर से लिखना पड़ा लेकिन अब इसके साथ काम करना बहुत आसान है।
टिन मैन

यदि आप जेएस का उपयोग करने का कोई अन्य कारण नहीं है, तो आपको अपने HTML प्रक्षेप के लिए जावास्क्रिप्ट का उपयोग नहीं करना चाहिए। यही कारण है कि गैर-जे एस ब्राउज़रों (हाँ, वहाँ के लिए अपनी साइट टूट जाएगा हैं कुछ)।
मार्नेन लाइबो-कोसर

1
यदि आप गैर-बची हुई सामग्री की अनुमति देते हैं, तो सुनिश्चित करें कि गैर-गलत मार्कअप सुनिश्चित करने के लिए आप पर निर्भर है।
मकारियो


0

जब से आप अनुवाद कर रहे हैं, और किसी व्यक्ति की भद्दी कोडित फ़ाइल से अपना वांछित कोड निकाल रहे हैं, क्या आप कॉन्टो में अपने regex के साथ content_tag का उपयोग कर सकते हैं।

एपीआई डॉक्स से चोरी, आप इस अनुवादित कोड को एक content_tagतरह से प्रक्षेपित कर सकते हैं:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

आपके कोड को न जानते हुए, इस तरह की सोच से यह सुनिश्चित हो जाएगा कि आपका अनुवादित कोड बहुत अधिक है।


मैं मान रहा हूं कि अनुवादित_text div के भीतर वास्तविक सामग्री है, है ना? उदाहरण के लिए, यह "हैलो वर्ल्ड!" होगा। क्या होगा अगर Translate_text में अधिक HTML हो, अर्थात नेस्टेड डिव या स्पैन? क्या मुझे तब कई बार content_tag पर कॉल करना होगा?
टिम

और ... सॉरी हिट जल्दी दर्ज करें ... प्रत्येक नेस्टेड डिव / स्पैन अभी भी एक content_tag है और आपको अभी भी इसे सही मानने की आवश्यकता है? चूंकि हम यह नहीं देख सकते हैं कि आप अपने फैंसी अनुवाद के साथ क्या कर रहे हैं? ;-), मुझे लगता है कि आप सभी टैग ढूंढेंगे, भले ही regex html के 'मूल' पर हो ... जैसे <ul>। आप सभी झूठ को एक बड़े गधे के रूप में नहीं डालेंगे, जिसे आप छाप सकें? हर एक का अपना होगा content_tag: li, text सही?
pjammer

0

@str = "<span class=\"classname\">hello</span>" अगर मेरे विचार में मैं करता हूँ

<%raw @str %> HTML स्रोत कोड वह <span class=\"classname\">hello</span>जगह है जहां मैं वास्तव में चाहता हूं <span class="classname">hello</span>(बिना बैकस्लैश के जो दोहरे> उद्धरणों से बच रहे थे)। उन दोहरे उद्धरण चिह्नों को "अनसेस्केप" करने का सबसे अच्छा तरीका क्या है?

समाधान: बैकस्लैश के साथ भागने से बचने के लिए सिंगल कोट्स (या सिंगल ऑफ डबल) के अंदर डबल कोट्स का उपयोग करें।

@str = '<span class="classname">hello</span>'
<%raw @str %>

0

HTML_safe संस्करण रेल 4 में अच्छा काम करता है ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.