रेल्स में - क्या नई लाइनों को <br> में परिवर्तित करने के लिए एक रेल विधि है?


115

वहाँ \ N कन्वर्ट करने के लिए एक लंबा रास्ता है <br>?

वर्तमान में, मैं इसे इस तरह कर रहा हूं:

mystring.gsub(/\n/, '<br>')

दो / वर्ण क्या करते हैं? मैं इसके बजाय "का उपयोग करता हूं।
अलमोडी

दो / चार संकेत है कि यह एक नियमित
अभिव्यक्ति है

जवाबों:


260

हां, रेल के पास simple_formatवही है जो आप देख रहे हैं, और थोड़ा बेहतर है क्योंकि यह पैराग्राफ टैग भी जोड़ता है। देख

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

उदाहरण:

 simple_format(mystring)

ध्यान दें कि simple_formatमूल HTML टैग की अनुमति देता है, लेकिन यह भी पाठ से गुजरता है sanitizeजिसके माध्यम से सभी लिपियों को हटा दिया जाता है, इसलिए यह उपयोगकर्ता इनपुट के लिए सुरक्षित होना चाहिए।


1
धन्यवाद- मुझे यह जानना चाहिए था- मैंने अन्य परियोजनाओं में simple_format का उपयोग किया है।
daustin777 19

3
यह ध्यान दिया जाना चाहिए कि simple_formatस्वचालित रूप से प्रदान किए गए पाठ को <p>टैग में लपेटता है , और इस कार्यक्षमता से बचा नहीं जा सकता है।
आइजैक मूर

1
अगर वेब ऐप के लिए इसका उपयोग किया जाता है तो simple_format सुरक्षा जोखिम है। यह javascript:alert(\no!\)संदर्भ में दिए गए विशेष वाक्यविन्यास की व्याख्या करने वाली रेल पर निर्भर करता है । दुर्भावनापूर्ण हैकर्स के साथ काम करने के लिए अंतहीन विविधताएं और भविष्य की विविधताएं हो सकती हैं।
क्लो

3
4 रेल के बाद से, simple_format के पास wrapper_tagविकल्प है जो <p>किसी और चीज़ के लिए टैग बदलने की अनुमति देता है
Lluís

41

आप इसे और अधिक सामान्य बना सकते हैं:

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

इस तरह से आप DOS, * NIX, Mac और आकस्मिक अमान्य लाइन अंत को कवर करेंगे।


5
सामान्यीकृत, गैर-रेल समाधान के लिए +1। रूबी देव के रूप में, जो रेल को पसंद नहीं करते हैं, इनमें से बहुत कम हैं।
विनफील्ड ट्रेल

3
अच्छा रेगेक्स, धन्यवाद। यदि आप कुछ ऐसा ही करना चाहते हैं, तो simple_formatआप उस रेगेक्स पर विभाजित हो सकते हैं, टैग mapखोलने और बंद pकरने में तार लपेटने के लिए उपयोग कर सकते हैं , और फिर उन्हें जोड़ सकते हैं। mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinयह करना चाहिए, हालांकि मैं यह परीक्षण नहीं किया।
ब्रायन कुंग

बहुत बढ़िया ट्रिक @BriKung यह वही था जो मैं ढूंढ रहा था!
अलेवेंटुराइयो

इसके अलावा अगर आप जेनरेट किए गए html टैग को रेल व्यू में सुरक्षित बनाना चाहते हैं, तो बस कुछ ऐसा करें और आप प्रत्येक उत्पन्न आइटम के लिए एक क्लास भी जोड़ सकते हैं <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>:। और यह एक आकर्षण booooo की तरह काम करता है!
अलेक्सवेंटुरायो

भले ही यह जवाब काफी ऊपर उठाया गया है, मैं जोड़ना चाहता हूं कि यह क्रॉस साइट स्क्रिप्टिंग के लिए अतिसंवेदनशील है। आप इसे केवल तभी कर सकते हैं, यदि आप इनपुट पर भरोसा करते हैं (अर्थात कोई उपयोगकर्ता इनपुट नहीं)। अन्यथा mystringमनमाना HTML हो सकता है।
नोबोडिस नाइटमेयर

29

जब आप उपयोगकर्ता इनपुट के साथ काम कर रहे हों तो आपको इससे सावधान रहना चाहिए। टैग
simple_formatसम्मिलित करता है <br>, लेकिन यह अन्य HTML टैग की अनुमति देगा !

Simple_format का उपयोग करते समय, <b>Hello</b>" Hello " के रूप में प्रस्तुत किया जाएगा , आप यह नहीं चाह सकते हैं।

इसके बजाय आप उपयोग कर सकते हैं <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()पहले html को एन्कोड करेंगे, gsubलाइन ब्रेक को बदल देंगे और टैग प्रदर्शित करने की html_safeअनुमति देंगे <br>

यह वही प्रदर्शित करेगा जो उपयोगकर्ता ने दर्ज किया था। यह उदाहरण के लिए टिप्पणियों में html पर चर्चा करने की भी अनुमति देता है।


हां। इस तरह, यह काम करता है और मैं इनपुट की तरह ही आउटपुट चाहता हूं, जैसा कि रिटर्न दिखाया गया है।
टिम

simple_formatमूल HTML टैग की अनुमति देते समय , यह ध्यान रखना महत्वपूर्ण है कि यह पाठ को भी पास करता है sanitize, जो कुछ भी हटाता है जो संभवतः दुर्भावनापूर्ण हो सकता है। apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

यह ध्यान रखना महत्वपूर्ण है कि यहां तक ​​कि एचटीएमएल भी संक्षिप्त लिंक की अनुमति देता है। एक लिंक का उपयोग उपयोगकर्ताओं को फ़िशिंग साइट पर ले जाने के लिए किया जा सकता है। यदि आप अपने एप्लिकेशन द्वारा भेजे गए ईमेल में उपयोगकर्ता द्वारा जनरेट किए गए संदेश को प्रदर्शित कर रहे हैं तो आपको इससे विशेष रूप से सावधान रहना होगा।
जेम्स

17

बस उपयोग करें

white-space: pre-line;

आपके सीएसएस में और पाठ लाइन ब्रेक पर लपेट जाएगा।


हाँ, बस simple_format किनारे के मामलों के लिए मेरे लिए काम नहीं करता है जैसे कि विभिन्न नए समाचारों को समाप्‍त करना। उदाहरणार्थ \ r \ n \ r \ n
ईमैक्सी

1
अच्छा सुरुचिपूर्ण समाधान जो वास्तव में ओपी का अनुरोध कर रहा है और अधिक नहीं है - html टैग के साथ पाठ को html के रूप में प्रस्तुत नहीं किया जाएगा। मेरे मामले में मैं चाहता था कि आउटपुट बिल्कुल इनपुट से मेल खाए (उदाहरण <b> </ b> बोल्ड में टेक्स्ट प्रदर्शित नहीं करेगा।
डेविड

1

आप यह भी विचार कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं - यदि आप अच्छी तरह से पाठ को प्रारूपित कर रहे हैं जिसे लोगों ने दर्ज किया है, तो आप अपने उपयोगकर्ताओं को अपने पाठ को स्वरूपित करने के लिए मार्कडाउन जैसे एक फ़िल्टर पर विचार कर सकते हैं, जो कि HTML के कीड़े के बिना खोल सकते हैं। तुम्हें पता है, जैसे यह स्टैक ओवरफ्लो में यहाँ है।


0

नहीं। आपके पास जो कुछ भी है वह आमतौर पर इस्तेमाल किया जाने वाला विकल्प है। अधिकांश लोगों द्वारा उपयोग की जाने वाली परिभाषा है:

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

इसे इस तरह नामित किया गया है क्योंकि यह उसी नाम से PHP फ़ंक्शन की कार्यक्षमता की नकल करता है


1
मैं नीच नहीं था, लेकिन मैं उन्हें इस तरह समझाऊंगा: एक ऐसा जवाब जो खाते में लेने में विफल रहता है जैसे कि simple_format परेशान नहीं लगता है, लेकिन एक निश्चित "नोप" के साथ। शुरुआत में लोगों को और आगे देखने से हतोत्साहित करता है।
सेसोइड 25'14

0
mystring.gsub(/\r\n|\r|\n/, '\n')

मेरे लिए काम किया


0

आप ऐसा कर सकते हैं simple_format(h(text))- hयह सुनिश्चित करेगा कि कोई भी HTML प्रदान नहीं की गई है।

जैसा कि अन्य उत्तरों में बताया गया है, यह आपके द्वारा मांगे जाने से थोड़ा अधिक होगा। यह पूरी चीज़ को लपेटता है <p>, और अधिक पैराग्राफ जोड़ता है यदि आपके पास कहीं भी डबल न्यूलाइन्स हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.