2014-07-22 3 views
5

नियंत्रक में मैं निम्नलिखित फ़्लैश संदेश है:रेल 4, फ्लैश संदेश में लिंक HTML के रूप में पार्स नहीं है

<div id="main_flash_area"> 
<% flash.each do |name, msg| %> 
    <div class="alert text-center alert-info"> 
     <a class="close" data-dismiss="alert">&times; Закрыть</a> 
     <%= msg %> 
    </div> 
<% end %> 
</div> 

यह थोड़े एक में प्रस्तुत करता है:

flash[:notice] = %Q[Please #{view_context.link_to('create a new account', new_account_path)}, after that you will be able to create orders.].html_safe 

यहाँ लेआउट में फ्लैश क्षेत्र है लिंक, लेकिन ब्राउज़र हालांकि इसे एक लिंक के रूप में पार्स नहीं करता है।

<div id="main_flash_area"> 
    <div class="alert text-center alert-info"> 
     <a class="close" data-dismiss="alert">× Закрыть</a> 
     Please &lt;a href="/accounts/new"&gt;create a new account&lt;/a&gt;, after that you will be able to create orders. 
    </div> 
</div> 

मैं इसे एक उचित लिंक कैसे कर सकता हूँ: यह

Please <a href="/accounts/new">create a new account</a>, after that you will be able to create orders. 

उत्पन्न HTML के रूप में प्रदर्शित किया जाता है? मुझे लगता है कि यह किसी बिंदु पर < ए> टैग से बच निकलता है।

+0

यहाँ इसे ठीक करने पर क्यों यह हो रहा है पर कुछ प्रसंग, और चर्चा है // समूहों .google.com/फोरम/#! विषय/rubyonrails-core/z52zgDgUmbs –

उत्तर

12

आपको दृश्य में sanitise अपने फ़्लैश msg की आवश्यकता है।

<%= sanitize(msg) %>

इस बल्कि एचटीएमएल भागने से ध्यान में रखते हुए लिंक प्रदान करेगा।

ध्यान रखें कि यह आपके ऐप में सभी फ़्लैश संदेशों पर लागू होगा। यदि आप फ़्लैश संदेश में कोई भी उपयोगकर्ता इनपुट प्रदर्शित करते हैं तो आपको इसे प्रदर्शित करने से पहले इसे बचाना याद रखना होगा क्योंकि रेल ऑटो एस्केपिंग लागू नहीं होगी।

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

+0

बढ़िया, यह वही है जो मुझे चाहिए! – Extrapolator

+2

क्या सभी फ़्लैश संदेशों को डी-सैनिटाइज किए बिना ऐसा करने का कोई तरीका है? – 0112

2

आपके समाधान nmott के लिए बहुत बहुत धन्यवाद।

भविष्य के पाठकों के लिए यहां थोड़ा और संदर्भ है, आपके समाधान सहित, क्योंकि मुझे समझ में नहीं आया कि इसका उपयोग कैसे किया जाए।

विचार/लेआउट/application.html.erb में, एचटीएमएल प्रस्तुत करने के लिए sanitize (msg) देखें।

<body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
    <% flash.each do |name, msg| %> 
    <%= content_tag(:div, sanitize(msg), class: "alert alert-info") %> 
<% end %> 
<%= yield %> 
</div> 
</body> 

यह एक अद्यतन के लिए काम करते हैं, नियंत्रकों में बनाने के लिए/your_model_controller.rb: https::

संबंधित मुद्दे