2014-07-22 6 views
5

In Controller analysiert Ich habe folgende Flash-Mitteilung:Rails 4, Link in Flash-Mitteilung wird nicht als HTML

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 

Hier Bereich Flash-in-Layout:

<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> 

es irgendwie in eine rendert Link, aber der Browser analysiert es nicht als Link. Es wird angezeigt, wie

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

die erzeugte HTML:

<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> 

Wie kann ich es machen einen entsprechenden Link? Ich denke, es entkommt < ein> Tag an einem bestimmten Punkt.

+0

Hier ist ein Zusammenhang auf, warum dies geschieht, und die Diskussion darüber, wie es zu beheben: https: // Gruppen .google.com/forum/#! topic/rubyonrails-core/z52zgDgUmbs –

Antwort

12

Sie müssen sanitise Ihr Flash msg in der Ansicht.

<%= sanitize(msg) %>

Dies wird den Link in der Ansicht, anstatt Flucht aus dem html machen.

Beachten Sie, dass dies für alle Flash-Nachrichten in Ihrer App gilt. Wenn Sie eine Benutzereingabe in der Flash-Nachricht anzeigen, müssen Sie daran denken, sie zu entgehen, bevor Sie sie anzeigen, da die automatische Escapierung von Rails nicht zutrifft.

Beachten Sie die sanitize Helfer ist weniger zulässig, dass die raw Helfer und es kann konfiguriert werden. Es funktioniert automatisch mit Links, es entfernt script Tags standardmäßig bietet einige Schutz, wenn Sie Benutzerinhalte in Ihrem Flash haben, aber Sie müssen eine vollständige Überprüfung durchführen, um sicherzustellen, dass Sie keine Sicherheitsprobleme einführen. Weitere Informationen finden Sie in den Rails-Dokumenten.

+0

Großartig, es ist genau das, was ich brauchte! – Extrapolator

+2

Gibt es eine Möglichkeit, dies zu tun, ohne alle Flash-Nachrichten zu desinfizieren? – 0112

2

vielen dank für ihre lösung nmott.

Hier ist ein bisschen mehr Kontext für zukünftige Leser, einschließlich Ihrer Lösung, da ich nicht verstehen konnte, wie man es benutzt.

in Ansichten/layout/application.html.erb, beachten Sie die Bereinigung (msg), um HTML zu rendern.

<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> 

Um es für ein Update funktioniert, in Controller/your_model_controller.rb: